关于如何过滤Pandas Dataframe 的一些想法

xienkqul  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(109)

我想过滤一个Pandas的数据框架。显然我可以用几个循环来完成,但是对于大量的数据来说效率不高,所以我想问一些关于如何做的想法。
我把数据组织成,

c1=t c2=detector(1,2,or3)  c3
1     1
1     2
2     1
2     2
2     3
3     2
3     3
4     1
4     3
...

它可以看作是模拟c1=t的次数,c2是模拟的探测器类型,有时候你没有其中一个探测器的数据,所以我想把数据分成 Dataframe ,每个 Dataframe 对应相同的探测器次数。
第一列是索引递增列,第二列只能有3个值(1,2,3),我想将此 Dataframe 分为3个,

  • 一个包含所有行,其中对于相同的c1,您有1和2个值
  • 一个包含所有行,其中对于相同的c1,您有1和3个值
  • 一个包含所有行,其中对于相同的c1,您有2个和3个值
  • 最后一个包含所有三个值1,2,3

没有唯一的c1行。
我想知道如何将是Python的方式来过滤这个 Dataframe 。

zf9nrax1

zf9nrax11#

您可以聚合set,因此c2中值的顺序并不重要:

s = df.groupby('c1')['c2'].agg(set)
print (s)
c1
1       {1, 2}
2    {1, 2, 3}
3       {2, 3}
4       {1, 3}
Name: c2, dtype: object

然后通过匹配集过滤c1

df1 = df[df['c1'].isin(s.index[s.eq(set([1,2]))])]
df2 = df[df['c1'].isin(s.index[s.eq(set([1,3]))])]
df3 = df[df['c1'].isin(s.index[s.eq(set([2,3]))])]
df4 = df[df['c1'].isin(s.index[s.eq(set([1,2,3]))])]

另一个想法是创建DataFrame字典:

s = df.groupby('c1')['c2'].agg(set)
print (s)

c1
1       {1, 2}
2    {1, 2, 3}
3       {2, 3}
4       {1, 3}
Name: c2, dtype: object

vals = [(1,2),(1,3),(2,3),(1,2,3)]

dfs = {'_'.join(map(str, x)): df[df['c1'].isin(s.index[s.eq(set(x))])] for x in vals}
print (dfs)
{'1_2':    c1  c2
0   1   1
1   1   2, '1_3':    c1  c2
7   4   1
8   4   3, '2_3':    c1  c2
5   3   2
6   3   3, '1_2_3':    c1  c2
2   2   1
3   2   2
4   2   3}

print (dfs['1_2'])
print (dfs['1_3'])
print (dfs['2_3'])
print (dfs['1_2_3'])

相关问题