如何将pandas中的一个列条目与另一行中的另一个类似列条目进行匹配?

2024-04-29 06:05:01 发布

您现在位置:Python中文网/ 问答频道 /正文

对于给定的表:

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'])

我希望将两列中相似的名称相互映射,其余部分作为单独的行条目。 我知道正则表达式可以解决这个问题,但我希望这个问题在规模,因为我有很多行。我试着使用不同的内置函数和单词库,比如FastText,但解决不了这个问题

我希望将列Name1映射到Name2

我该怎么解决这个问题?我仍然认为我犯了一些愚蠢的错误


Tags: dataframedenanrobertnicolasname1cagemorgan
1条回答
网友
1楼 · 发布于 2024-04-29 06:05:01

首先,列出所有演员的名字

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)

然后我们制作一个熊猫数据帧

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

我用关键字做了一个dict,actos名称和值是字符串的actor名称

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'

演员们

{'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的'Name1'列中添加键,在'Name2'列中添加值

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

我希望这对你有帮助

相关问题 更多 >