将元素列表映射到pandas中的元素类别?

时间:2018-03-09 13:28:00

标签: python python-2.7 pandas dataframe

我一直在谷歌搜索,但我仍然找不到快速的方法。 假设我的csv文件中有一列:

1. C.Ronald         
2. Conor McGregor    
3. Lionel Messi
4. LeBron James
5. Derrick Rose   
6. Tom Brady
7. ...
8. ...

依此类推,我想通过python将这些名称替换为以下三个类别:

1. Soccer player
2. MMA fighter
3. Soccer player
4. NBA player
5. NBA player
6. NFL plaer
7. ... 
8. ...

我怎么能立刻将'C.Ronald','Lionel Messi'和那些足球运动员的名字替换成一个班级,但不是一个一个,因为我有一个很长的专栏。

1 个答案:

答案 0 :(得分:2)

您需要创建一个映射表单类型的播放器列表。

然后,您可以使用面向数据的包(例如pandas)通过字典为您执行映射:

from io import StringIO
import pandas as pd

mystr = StringIO("""C.Ronald
Conor McGregor
Lionel Messi
LeBron James
Derrick Rose
Tom Brady
""")

df = pd.read_csv(mystr, header=None, names=['Player'])

d = {'Soccer player': ['C.Ronald', 'Lionel Messi'],
     'MMA fighter': ['Conor McGregor'],
     'NBA player': ['LeBron James', 'Derrick Rose'],
     'NFL player': ['Tom Brady']}

df['Category'] = df['Player'].map(lambda x: next((k for k, v in d.items() if x in v), None))

#            Player       Category
# 0        C.Ronald  Soccer player
# 1  Conor McGregor    MMA fighter
# 2    Lionel Messi  Soccer player
# 3    LeBron James     NBA player
# 4    Derrick Rose     NBA player
# 5       Tom Brady     NFL player

<强>解释

生成器表达式上的

next返回下一次迭代;它在找到第一个实例时停止。如果你有一个多个类别的运动员,这只会成为一个问题。如果未找到匹配项,则仅返回参数None