用 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.splitexpand=True 创建DataFrames,并用于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 中出现频率最高的单词替换单元格的主要内容,如果未能解决你的问题,请参考以下文章

pandas:统计某一列字符串中特定单元出现的频率

创建 DataFrame 后设置 pandas DatetimeIndex 的频率

pandas:如何获取pandas系列中出现频率最高的item?

Python/Pandas DataFrame 中的频率图

pandas使用datetime创建示例dataframe:包含完整的时分秒信息创建时间索引使用不同的时间频率date_range中参数freq的偏移量别名

Pandas - 最近 x 天的值的计数频率