我想根据一列的不同值来总结一个大型数据框,关于它们是否仅限于其他列的单个或多个不同值的出现。我目前执行此操作的方法确实令人费解,我正在寻找一种解决此类问题的熊猫模式。

给定以下示例数据框:

import pandas as pd
pd.DataFrame({'c': ['x', 'x',  'y', 'y',  'z', 'z'],
              's': ['a1', 'a1',  'a1', 'a1',  'a1', 'a2'],
              't': [1, 1,  1, 2,  1, 1]})


我如何获得(计数)列c的不同值:

1)仅结合列st的单个值观察到。
所需的输出:set('x')和/或其长度:1

2)仅在列s的单个值但列t的值大于1的情况下才观察到。
所需的输出:set('y')和/或其长度:1

3)与列s的> 1值和任意数量的不同列t的值结合使用时观察到。
所需的输出:set('z')和/或其长度:1

编辑:
使用以下修订的df再一个q!

df = pd.DataFrame({'c': ['x', 'x', 'y', 'y', 'z', 'z', 'z1', 'z1', 'z2'],
              's': ['a1', 'a1', 'a1', 'a1', 'a1', 'a2', 'a3', 'a3', 'a4'],
              't': [1, 1, 1, 2, 1, 1, 3, 3, 1],
              'cat': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'a']})


4)观察到两次或多次,并且仅与列st的单个值结合使用,并且仅限于cat 'a'
所需的输出:set('x')和/或其长度:1

谢谢!

最佳答案

想法是将DataFrame.duplicated用于所有重复的keep=False列,并按boolean indexing进行过滤:

m1 = df.duplicated(['c','s','t'], keep=False)
m2 = df.duplicated(['c','s'], keep=False) & ~m1
m3 = df.duplicated(['c','t'], keep=False) & ~m1

a = df.loc[m1, 'c']
print (a)
0    x
1    x
Name: c, dtype: object

b = df.loc[m2, 'c']
print (b)
2    y
3    y
Name: c, dtype: object

c = df.loc[m3, 'c']
print (c)
4    z
5    z
Name: c, dtype: object


然后将列转换为集合:

out1, out2, out3 = set(a['c']), set(b['c']), set(c['c'])
print (out1)
{'x'}
print (out2)
{'y'}
print (out3)
{'z'}


对于长度:

out11, out21, out31 = len(out1), len(out2), len(out3)
print (out11)
print (out21)
print (out31)
1
1
1


另一个想法是通过concatDataFrame.dot创建新列:

df1 = pd.concat([m1, m2, m3], axis=1, keys=('s&t','s','t'))
print (df1)
     s&t      s      t
0   True  False  False
1   True  False  False
2  False   True  False
3  False   True  False
4  False  False   True
5  False  False   True

df['new'] = df1.dot(df1.columns)


然后使用set和功能nunique进行聚合:

df2 = (df.groupby('new')['c']
         .agg([('set', lambda x: set(x)),('count','nunique')])
         .reset_index())
print (df2)
   new  set  count
0    s  {y}      1
1  s&t  {x}      1
2    t  {z}      1

关于python - 计数仅在B和/或C列中有一个唯一值的情况下观察到的A列的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60301237/

10-10 11:21