在python中,我有一个这样的数据框
水果 | |
---|---|
詹姆斯 | [苹果、梨、苹果] |
彼得 | [苹果、梨、苹果] |
我想得到苹果和梨的数量。非常感谢这方面的任何帮助。
水果 | 苹果 | 梨 | |
---|---|---|---|
詹姆斯 | [苹果、梨、苹果] | 2 | 1 |
彼得 | [苹果、梨、苹果] | 2 | 1 |
我试过用这个:
d['Apple'] = (d.Fruits == 'Apple').sum() and
d['Apple'] = (d.Fruits.values == 'Apple').sum()
答案 0 :(得分:2)
如果性能很重要并且需要计算所有值的解决方案:
from collections import Counter
df = df.join(pd.DataFrame([Counter(x) for x in df.Fruits.to_numpy()], index=df.index))
print (df)
Fruits Apple Pear
James [Apple, Pear, Apple] 2 1
Peter [Apple, Pear, Apple] 2 1
如果要单独测试值:
df['Apple'] = df.Fruits.apply(lambda x: sum(y == 'Apple' for y in x))
df['Pear'] = df.Fruits.apply(lambda x: sum(y == 'Pear' for y in x))
答案 1 :(得分:2)
使用 value_counts + concat:
res = pd.concat((df, df['Fruits'].apply(pd.Series.value_counts)), 1)
print(res)
输出
Fruits Apple Pear
James [Apple, Pear, Apple] 2 1
Peter [Apple, Pear, Apple] 2 1
更通用的方法是:
res = pd.concat((df, df['Fruits'].apply(pd.Series.value_counts).fillna(0)), 1)
print(res)
答案 2 :(得分:2)
您可以将 df.explode
和 groupby.value_counts
与 unstack
一起使用:
out = (df.join(df['Fruits'].explode().groupby(level=0).value_counts()
.unstack(fill_value=0)))
print(out)
Fruits Apple Pear
James [Apple, Pear, Apple] 2 1
Peter [Apple, Pear, Apple] 2 1
答案 3 :(得分:1)
对于任何列表,您都可以使用 Collections.Counter()
它适用于一个简单的逻辑,例如Counter(item)
您可以循环整个列表并计算您的项目,它将提供您的输出。