首页 > 解决方案 > 用 pandas 替换和映射 Python 数据框中的字符串值

问题描述

嗨,我一直在尝试替换数据框中的字符串值(字符串是 NFL 球队的缩写),我有这样的事情:

Index   IDMatch Usr1    Usr2    Usr3    Usr4    Usr5
0       1       Phi     Atl     Phi     Phi     Phi
1       2       Bal     Bal     Bal     Buf     Bal
2       3       Ind     Ind     Cin     Cin     Ind
3       4       NE      NE      Hou     NE      NE
4       5       Jax     Jax     NYG     NYG     NYG

和一个带有映射的数据框,如下所示:

Index  TEAM_YH  TeamID
0      ARI       1
1      ATL       2
2      BAL       3
...
31     WAS       32

我想用 TeamID 替换每个字符串以进行基本统计(频率),我尝试了下一个:

## Dataframe with strings and Team ID
dfDicTeams = dfTeams[['TEAM_YH','TeamID']].to_dict('dict')

## Dataframe with selections by users
dfW1.replace(dfDicTeams[['TEAM_YH']],dfDicTeams[['TeamID']]) ## Error: unhashable type: 'list'

dfW1.replace(dfDicTeams) ## Error: Replacement not allowed with overlapping keys and values

我究竟做错了什么?可以这样做吗?

我正在使用 Python 3,我想要这样的东西:

Index   IDMatch Usr1    Usr2    Usr3    Usr4    Usr5
0       1       26      2       26      26      26
1       2       3       3       3       4       3
2       3       14      14      7       7       14
3       4       21      21      13      21      21
4       5       15      15      23      23      23

汇总选项:

IDMatch ATeam Count HTeam Count
1       26      4   2       1
2       3       4   4       1
3       14      3   7       2
4       21      4   13      1
5       15      2   23      3

标签: pythonpython-3.xpandasdataframe

解决方案


给定一个主输入数据框df和一个映射数据框df_map,您可以创建一个系列映射,然后使用pd.DataFrame.applymap自定义函数:

s = df_map.set_index('TEAM_YH')['TeamID']
df.iloc[:, 2:] = df.iloc[:, 2:].applymap(lambda x: s.get(x.upper(), -1))

print(df)

   Index  IDMatch  Usr1  Usr2  Usr3  Usr4  Usr5
0      0        1     7     2     7     7     7
1      1        2     3     3     3     4     3
2      2        3     5     5    -1    -1     5
3      3        4    -1    -1    -1    -1    -1
4      4        5     6     6    -1    -1    -1

df_map用于计算上述结果的示例:

Index  TEAM_YH  TeamID
0      ARI       1
1      ATL       2
2      BAL       3
3      BUF       4
4      IND       5
5      JAX       6
6      PHI       7
32     WAS       32

推荐阅读