在单元格中的列表中计算字符串出现次数

3

在Python中,我有一个类似于以下的数据框:

Fruits
James [Apple, Pear, Apple]
Peter [Apple, Pear, Apple]

我想要得到苹果和梨子的数量。任何帮助都将不胜感激。

Fruits Apple Pear
James [Apple, Pear, Apple] 2 1
Peter [Apple, Pear, Apple] 2 1

我尝试了这个:

d['Apple'] = (d.Fruits == 'Apple').sum() and
d['Apple'] = (d.Fruits.values == 'Apple').sum()
4个回答

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

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
你可以使用df.explodegroupby.value_countsunstack一起使用:
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

1
对于任何列表,您可以使用Collections.Counter(),它使用简单的逻辑,例如Counter(item)。您可以循环整个列表并计数项目,它将给出输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接