我希望计算数据帧行中特定列的单元格中的唯一行/条目的数量。理想情况下,我想要每行中唯一行/条目的数量的计数。在下面的示例中,我用逗号分隔了条目,但是在我的数据中,每个条目都在新行上(没有逗号):
例如,我有一个数据帧,如下所示:
ID A B
1 1,2,1,2 1,2,3,4
2 1,2,3,4 1,2,1,2
3 1,2,3 3,4
4 4,1
预期的结果应该类似于:
ID A B countA countB
1 1,2,1,2 1,2,3,4 2 4
2 1,2,3,4 1,2,1,2 4 2
3 1,2,3 3,4 3 2
4 4,1 1 0
任何我非常欣赏的想法,我已经查看了groupby,唯一和大小,但是这只适用于唯一的行,而不适用于行中的条目。希望我的解释足够清楚,提前感谢您的帮助。
发布于 2018-06-10 01:40:44
使用iloc
表示省略第一行,并按applymap
唯一值和拆分值的set
长度进行元素计数:
#if missing values are NaNs
df1 = df.iloc[:, 1:].applymap(lambda x: len(set(x.split(','))) if isinstance(x, str) else 0)
#if missing values are empty strings
df1 = df.iloc[:, 1:].applymap(lambda x: len(set(x.split(','))) if x != '' else 0)
重命名列的带有add_prefix
的原始DataFrame
的最后一个join
:
df = df.join(df1.add_prefix('Count'))
print (df)
ID A B CountA CountB
0 1 1,2,1,2 1,2,3,4 2 4
1 2 1,2,3,4 1,2,1,2 4 2
2 3 1,2,3 3,4 3 2
3 4 4,1 NaN 2 0
发布于 2018-06-10 01:52:36
您可以使用列表理解。注意,矢量化的方法不可能通过Pandas实现,所以如果性能很重要,你应该测试不同的解决方案。
下面我们使用filter(None, ...)
来避免计算空字符串。
def counter(x):
return [len(set(filter(None, i.split(',')))) for i in x]
for col in ['A', 'B']:
df['count'+col] = counter(df[col])
print(df)
ID A B countA countB
0 1 1,2,1,2 1,2,3,4 2 4
1 2 1,2,3,4 1,2,1,2 4 2
2 3 1,2,3 3,4 3 2
3 4 4,1 2 0
https://stackoverflow.com/questions/50776914
复制相似问题