在python中,我有一个类似的数据帧
水果 | |
---|---|
James | [苹果、梨、苹果] |
Peter | [苹果,梨,苹果] |
如果性能很重要并且需要计算所有值,则解决方案:
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))
使用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)
您可以将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
对于任何列表,您都可以使用Collections.Counter()
它使用一个简单的逻辑,比如Counter(item)
。你可以循环你的整个列表,并对你的项目进行计数,它会给出你的输出。