对给定的表格说:
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。我仍然认为自己犯了一些愚蠢的错误。
答案 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
希望对您有帮助。