如何将熊猫中的一个列条目与另一行中的另一个相似的列条目进行匹配?

时间:2019-01-06 13:24:56

标签: python pandas

对给定的表格说:

d.DataFrame([['Johnny Depp', 'Keanu Reeves'],
             ['Robert De Niro', 'Nicolas Cage'],
             ['Brad Pitt', 'Johnny Depp'],
             ['Leonardo DiCaprio', 'Morgan Freeman'],
             ['Tom Cruise', 'Hugh Jackman'],
             ['Morgan Freeman', 'Robert De Niro']],
             columns=['Name1', 'Name2'])

我希望输出为:

pd.DataFrame([['Johnny Depp', 'Johnny Depp'],
              ['Robert De Niro', 'Robert De Niro'],
              ['Brad Pitt', NaN],
              ['Leonardo DiCaprio', NaN],
              ['Tom Cruise', NaN],
              ['Morgan Freeman', 'Morgan Freeman'],
              [NaN ,'Keanu Reeves'],
              [NaN ,'Nicolas Cage'],
              [NaN ,'Hugh Jackman']],
              columns=['Name1', 'Name2'])

我希望将两列中的相似名称相互映射,其余名称作为单独的行条目。 我知道Regex可以解决此问题,但是由于我有很多行,因此我希望大规模实现此目的。我尝试使用其他内置的熊猫函数和单词库(如FastText),但无法解决此问题。

我希望将Name1列映射到Name2。

我该如何解决? PS。我仍然认为自己犯了一些愚蠢的错误。

1 个答案:

答案 0 :(得分:0)

首先,您要列出所有演员的姓名。

actors = ['Johnny Depp', 'Keanu Reeves',
      'Robert De Niro', 'Nicolas Cage',
      'Brad Pitt', 'Johnny Depp',
      'Leonardo DiCaprio', 'Morgan Freeman',
      'Tom Cruise', 'Hugh Jackman',
      'Morgan Freeman', 'Robert De Niro',
]

然后使用collections.Counter类。这是一个强大的类,当我们 想找到一个元素的频率。

from collections import Counter

actors_counts = Counter(actors)
actors_list = list(actors_counts.items())
print(actors_list)

然后我们制作一个熊猫DataFrame,

import pandas as pd
actors_df = pd.DataFrame(actors_list, columns=['Name','Frequency'])
print(actors_df)

它输出

                Name  Frequency
0        Johnny Depp          2
1       Keanu Reeves          1
2     Robert De Niro          2
3       Nicolas Cage          1
4          Brad Pitt          1
5  Leonardo DiCaprio          1
6     Morgan Freeman          2
7         Tom Cruise          1
8       Hugh Jackman          1

我用键写一个字典,actos名称和值Nan字符串的演员名称

actors_dict = {}
for item in range(len(actors_df)):
    name = str(actors_df['Name'].iloc[item])
    freq = actors_df['Frequency'].iloc[item]
    if freq>1:
        actors_dict[name] = name
    else:
        actors_dict[name] = 'NaN'

actors_dict是

{'Johnny Depp': 'Johnny Depp',
'Keanu Reeves': 'NaN',
'Robert De Niro': 'Robert De Niro',
'Nicolas Cage': 'NaN',
'Brad Pitt': 'NaN',
'Leonardo DiCaprio': 'NaN',
'Morgan Freeman': 'Morgan Freeman',
'Tom Cruise': 'NaN',
'Hugh Jackman': 'NaN'}

最后,将键添加到DataFrame的“名称1”列中,并将值添加到“名称2”列中,

a = list(actors_dict.keys())
b = list(actors_dict.values())

actors = pd.concat([pd.DataFrame([(a[i], b[i])], columns=['Name1', 'Name2']) for i in range(len(a))],ignore_index=True)

输出应为

          Name1               Name2
0   Johnny Depp         Johnny Depp
1   Keanu Reeves                NaN
2   Robert De Niro   Robert De Niro
3   Nicolas Cage                NaN
4   Brad Pitt                   NaN
5   Leonardo DiCaprio           NaN
6   Morgan Freeman   Morgan Freeman
7   Tom Cruise                  NaN
8   Hugh Jackman                NaN

希望对您有帮助。