在 Pandas DataFrame 中,用最频繁的单词替换单元格

3

我有一个类似这样的数据框:

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

在这种情况下,当存在平局时,我随机选择第一个单词,但这并不重要。
提前致谢。
2个回答

3
使用Series.str.split创建DataFrame,并使用expand=True参数。然后使用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

谢谢。为什么我们要使用不同的技术来处理这两列,看起来它们都在做同样的事情?我们能否对这两列使用相同的代码?(并将其应用于所有列,因为我的实际数据有很多列)? - H_A
你不想对'Source1'列执行df['Source1'] = df['Source1'].str.split(',', expand=True).mode(axis=1).iloc[:, 0]吗?df['Source1'] = df['Source1'].str.split(',').str[0]只会返回第一个单词而不是最常见的那个。 - Phillyclause89

0

以下是我提供的代码,每个系列均可在一行中执行,无需额外的 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    |
+---+---------+------+

上面展示了两种突出选择的方法;这两种方法都可以适用于任何一种或两种系列。

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