繁体   English   中英

计算熊猫python中单元格/行中的行数

[英]Count number of lines in a cell/row in pandas python

我正在计算一个数据框行中特定列的单元格中唯一行/条目的数量。 理想情况下,我希望计算每行中唯一行/条目的数量。 在下面的示例中,我以逗号分隔的形式说明了这些条目,但是在我的数据中,每个条目都在换行符上(没有逗号):

例如,如果我有一个像这样的数据框:

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,unique和size的任何想法都值得赞赏,但这仅适用于唯一行,而不适用于行内的条目。 希望我的解释很清楚,在此先感谢您的协助。

使用iloc忽略第一行,并通过applymap的值的applymapset的长度,通过applymap唯一值逐个计数:

#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)

最后join到原有的DataFrameadd_prefix要重命名的列:

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

您可以使用列表推导。 请注意,通过熊猫无法实现矢量化方法,因此,如果性能很重要,则应测试不同的解决方案。

下面我们使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM