Python 从列表中查找数据帧中单词的频率
我想计算df中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
列表中每个水果的频率。
预期产出:
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