Python 从列表中查找数据帧中单词的频率

Python 从列表中查找数据帧中单词的频率,python,python-3.x,regex,pandas,Python,Python 3.x,Regex,Pandas,我想计算df中列表中每个水果的频率。 预期产出: import pandas as pd list = ['apple','banana','cherries','dragonfruit','elderberry'] data = {'name': ['Alpha', 'Bravo','Charlie','Delta','Echo'], 'favorite_fruit': ['apple banana cherries', 'banana cherries drago

我想计算df中
列表中每个水果的频率。
预期产出:

import pandas as pd
list = ['apple','banana','cherries','dragonfruit','elderberry']
data = {'name': ['Alpha', 'Bravo','Charlie','Delta','Echo'],
             'favorite_fruit':  ['apple banana cherries', 'banana cherries dragonfruit',
                           'cherries dragonfruit','dragonfruit','apple elderberry']}

df = pd.DataFrame (data, columns = ['name','favorite_fruit'])
代码
df.favorite\u fruit.str.split(expand=True).stack().value\u counts()
适用于小数据帧。 如果
df.favorite_水果
包含数千行不同的水果组合,
我怎样才能只找到
列表中单词的频率呢?

也许有点迂回,但是如果你的
最喜欢的水果
列总是用空格分隔的话,这样应该可以:

df2
Fruit       | Frequency
Apple       |    2     
Banana      |    2
Cherries    |    3
Dragonfruit |    3
Elderberry  |    1
这将打印出以下内容:

import pandas as pd

list = ['apple','banana','cherries','dragonfruit','elderberry']
data = {'name': ['Alpha', 'Bravo','Charlie','Delta','Echo'],
             'favorite_fruit':  ['apple banana cherries', 'banana cherries dragonfruit',
                           'cherries dragonfruit','dragonfruit','apple elderberry']}

df = pd.DataFrame (data, columns = ['name','favorite_fruit'])

new_df = pd.DataFrame()
data = {}

for i, row in df.iterrows():
    s = row['favorite_fruit']
    items = s.split(' ')
    for item in items:
        if item in data.keys():
            data[item].append(1)
        else:
            data[item] = [1]

for key, value in data.items():
    data[key] = sum(value)

fruit = []
frequency = []

for key, value in data.items():
    fruit.append(key)
    frequency.append(value)

new_df = pd.DataFrame({'fruit': fruit, 'frequency':frequency})
print(new_df)

也许这是一个循环孔答案,但您可以从您已经描述的答案中筛选出值。所以如果你从这个开始:

         fruit  frequency
0        apple          2
1       banana          2
2     cherries          3
3  dragonfruit          3
4   elderberry          1
您可以使用
isin
将数据限制为目标列表中的数据:

>>> df2 = df.favorite_fruit.str.split(expand=True).stack()
>>> df2

0  0          apple
   1         banana
   2       cherries
1  0         banana
   1       cherries
   2    dragonfruit
2  0       cherries
   1    dragonfruit
3  0    dragonfruit
4  0          apple
   1     elderberry
dtype: object
甚至在你最初的回答之后:

>>> target = ['apple', 'banana']
>>> df2[df2.isin(target)].value_counts()

banana    2
apple     2
dtype: int64

如果问题是
扩展
堆栈
操作的数据量太大,成本太高,那么这可能不会令人满意。但我认为这可能比基于循环的答案更好?

尝试在拆分后使用explode函数

>>> df.favorite_fruit.str.split(expand=True).stack().value_counts().loc[target]

apple     2
banana    2
dtype: int64

抱歉,很接近,但对我的“真正”问题不起作用。最喜欢的水果是一个字符串,其中包含一个句子,有时包含逗号和表情符号。上面的代码为我提供了
favorite\u fruit
列中所有单词的频率,而不仅仅是
列表中的单词频率。那么您需要更新和编辑您的最小工作示例以反映这一点。。。否则,我们无法帮助您…使用漏洞答案的第一部分是有效的,但第二部分,即代码
df.favorite\u fruit.str.split(expand=True).stack().value\u counts().loc[target]
返回一个关键错误:“不再支持传递带有任何缺少标签的likes to.loc或[],请参阅”。我将.loc更改为.reindex,但它不起作用。代码的第二部分,如果工作会更好,因为它不会添加更多的变量。@Luc hmmmm这对我来说很有用-我在您的
df=pd.DataFrame之后复制/粘贴该行。
line来自您的示例,我没有得到任何错误(还有
target=['apple','banana']
defined)。
value\u counts()
返回的序列应该以水果值作为索引,因此您应该能够将水果名与
loc
一起用于索引,这是因为我的真实数据中缺少标签。然而,如果第二种解决方案不起作用。第一个就可以了,不过我会创建很多变量。谢谢@Luc ahhh这是在你的真实数据中-这个错误应该意味着你的一个目标词不在数据框/值计数中-这可能吗?但是在这种情况下,
df.favorite\u fruit.str.split(expand=True).stack().value\u counts().reindex(target)
也适用于我。
df.favorite_fruit.str.split().explode().value_counts()

cherries       3
dragonfruit    3
banana         2
apple          2
elderberry     1
Name: favorite_fruit, dtype: int64