我想根据一列的不同值来总结一个大型数据框,关于它们是否仅限于其他列的单个或多个不同值的出现。我目前执行此操作的方法确实令人费解,我正在寻找一种解决此类问题的熊猫模式。
给定以下示例数据框:
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)仅结合列
s
和t
的单个值观察到。所需的输出:
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)观察到两次或多次,并且仅与列
s
和t
的单个值结合使用,并且仅限于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
另一个想法是通过
concat
和DataFrame.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/