用 Pandas DataFrame 中出现频率最高的单词替换单元格
Posted
技术标签:
【中文标题】用 Pandas DataFrame 中出现频率最高的单词替换单元格【英文标题】:Replace the cell with the most frequent word in Pandas DataFrame 【发布时间】:2020-07-25 18:44:25 【问题描述】:我有一个这样的数据框:
df = pd.DataFrame('Source1': ['Corona,Corona,Corona','Sars,Sars','Corona,Sars',
'Sars,Corona','Sars'],
'Area': ['A,A,A,B','A','A,B,B,C','C,C,B,C','A,B,C'])
df
Source1 Area
0 Corona,Corona,Corona A,A,A,B
1 Sars,Sars A
2 Corona,Sars A,B,B,C
3 Sars,Corona C,C,B,C
4 Sars A,B,C
我想检查每一列中的每个单元格(真实数据有很多列)并找到每个唯一单词的频率(我们可以用','来区分唯一单词),并将整个条目替换为最频繁的单词。
在平局的情况下,替换哪个单词并不重要。所以想要的输出应该是这样的:
df
Source Area
0 Corona A
1 Sars A
2 Corona B
3 Sars C
4 Sars A
在这种情况下,我随机选择在出现平局时选择第一个单词,但这并不重要。
提前致谢。
【问题讨论】:
【参考方案1】:由Series.str.split
和expand=True
创建DataFrame
s,并用于DataFrame.mode
按位置选择第一列:
df['Source1'] = df['Source1'].str.split(',', expand=True).mode(axis=1).iloc[:, 0]
df['Area'] = df['Area'].str.split(',', expand=True).mode(axis=1).iloc[:, 0]
print (df)
Source1 Area
0 Corona A
1 Sars A
2 Corona B
3 Sars C
4 Sars A
collections.Counter.most_common
的另一个想法:
from collections import Counter
f = lambda x: [Counter(y.split(',')).most_common(1)[0][0] for y in x]
df[['Source1', 'Area']] = df[['Source1', 'Area']].apply(f)
#all columns
#df = df.apply(f)
print (df)
Source1 Area
0 Corona A
1 Sars A
2 Corona B
3 Sars C
4 Sars A
【讨论】:
谢谢。为什么我们对两列使用不同的技术,看起来它们都在做同样的事情?我们可以对两列使用相同的代码吗? (并将其应用于所有列,因为我的真实数据上有很多列)? 你不想为'Source1'
列也做df['Source1'] = df['Source1'].str.split(',', expand=True).mode(axis=1).iloc[:, 0]
吗? df['Source1'] = df['Source1'].str.split(',').str[0]
只会返回第一个单词而不是最常见的单词。【参考方案2】:
这是我的产品,每个系列都可以在一行中执行,不需要额外的imports
。
df['Area'] = df['Area'].apply(lambda x: max(x.replace(',',''), key=x.count))
在替换Area
系列中找到的所有字符中的所有,
后,我们用key=x.count
替换出现次数最多的元素(或相等值的第一个元素)的字段论据。
您也可以使用类似的东西(用Source1
系列演示),从通过拆分字段创建的元素列表中返回最大值。
df['Source1'] = df['Source1'].apply(lambda x: max(list(x.split(',')), key=x.count))
+---+---------+------+
| | Source1 | Area |
+---+---------+------+
| 0 | Corona | A |
| 1 | Sars | A |
| 2 | Corona | B |
| 3 | Sars | C |
| 4 | Sars | A |
+---+---------+------+
上面显示的两种方法突出显示选择;两者都可以在其中一个或两个系列上充分发挥作用。
【讨论】:
以上是关于用 Pandas DataFrame 中出现频率最高的单词替换单元格的主要内容,如果未能解决你的问题,请参考以下文章
创建 DataFrame 后设置 pandas DatetimeIndex 的频率
pandas:如何获取pandas系列中出现频率最高的item?
pandas使用datetime创建示例dataframe:包含完整的时分秒信息创建时间索引使用不同的时间频率date_range中参数freq的偏移量别名