首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas -循环通过groupby df和filter by交叉点

Pandas -循环通过groupby df和filter by交叉点
EN

Stack Overflow用户
提问于 2018-06-30 03:56:32
回答 1查看 560关注 0票数 0

我在Pandas中组合以下步骤时遇到了问题:我有来自2个实体的快照。我已经找到了每个日期的两个实体之间的对象交集,这些对象存储在列表列表中(每个日期一个子列表)。

我现在想要过滤每个实体的原始数据帧,以便只考虑交叉点,所以我尝试使用布尔索引来过滤,同时也使用groupby。关于我试图构建的循环,请参见下面的内容:

代码语言:javascript
复制
filtered_df=pd.DataFrame()
for date_sublist in range(len(intersect_list):
    overlap_temp=df_orig[df_orig['ObjectName'].filter(intersect_list[date_sublist])]
    bkln_overlap.append(overlap_temp)

我还尝试了下面的构造作为测试,我试图只保存对象名称与特定交叉点列表匹配的行:

代码语言:javascript
复制
df_orig[df_orig['ObjectName'] in intersect_list[1]]

有人对这个问题有什么建议吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-06-30 04:08:03

在没有来自OP的样本数据的情况下,我将使用一个简单的示例来演示。我希望这就是你想要的,或者至少可以稍微修改一下来实现你想要的。

在再次阅读您的操作(以及您的评论)之后,我认为您应该将交叉点列表存储在字典中,如下所示:

代码语言:javascript
复制
intersections = {'01/01/2018': ['ObjectA','ObjectC'], '01/02/2018': ['ObjectA','ObjectD'], etc.....}

为此,请执行以下操作:

代码语言:javascript
复制
df = pd.DataFrame([['01/01/2018', 'ObjectA', 0, 0, 0, 1],['01/01/2018', 'ObjectE', 0, 1, 1, 1],['01/02/2018', 'ObjectB', 0, 0, 0, 0],
                ['01/04/2018', 'ObjectD', 0, 1, 1, 0],['01/02/2018', 'ObjectE', 1, 1, 0, 1],['01/03/2018', 'ObjectB', 0, 0, 0, 0],
                ['01/01/2018', 'ObjectC', 0, 1, 1, 0],['01/03/2018', 'ObjectA', 1, 1, 0, 1],['01/04/2018', 'ObjectD', 0, 0, 0, 0]],
                columns=['Date','Object','x1','x2','x3','x4'])

         Date   Object  x1  x2  x3  x4
0  01/01/2018  ObjectA   0   0   0   1
1  01/01/2018  ObjectE   0   1   1   1
2  01/02/2018  ObjectB   0   0   0   0
3  01/04/2018  ObjectD   0   1   1   0
4  01/02/2018  ObjectE   1   1   0   1
5  01/03/2018  ObjectB   0   0   0   0
6  01/01/2018  ObjectC   0   1   1   0
7  01/03/2018  ObjectA   1   1   0   1
8  01/04/2018  ObjectD   0   0   0   0

'Date'分组

代码语言:javascript
复制
grouped = df.groupby('Date')
intersections = {key: list(set(grouped.get_group(key)['Object'])) for key, val in grouped}

提供:

代码语言:javascript
复制
{'01/01/2018': ['ObjectE', 'ObjectA', 'ObjectC'], '01/02/2018': ['ObjectE', 'ObjectB'], '01/03/2018': ['ObjectA', 'ObjectB'], '01/04/2018': ['ObjectD']}

然后应用交叉点字典中的过滤器:

代码语言:javascript
复制
out = [df[(df['Date']==key) & (df['Object'].isin(val))] for key, val in intersections.items()]

提供:

代码语言:javascript
复制
         Date   Object  x1  x2  x3  x4
0  01/01/2018  ObjectA   0   0   0   1
1  01/01/2018  ObjectE   0   1   1   1
6  01/01/2018  ObjectC   0   1   1   0
         Date   Object  x1  x2  x3  x4
2  01/02/2018  ObjectB   0   0   0   0
4  01/02/2018  ObjectE   1   1   0   1
         Date   Object  x1  x2  x3  x4
5  01/03/2018  ObjectB   0   0   0   0
7  01/03/2018  ObjectA   1   1   0   1
         Date   Object  x1  x2  x3  x4
3  01/04/2018  ObjectD   0   1   1   0
8  01/04/2018  ObjectD   0   0   0   0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51108600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档