python - 用 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
解决方案
给定一个主输入数据框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
推荐阅读
- json - 在 Flutter 中从 JSON 转换的列表对象中为变量赋值
- perl - 如何计算 Perl 中出现的奇数次?
- python - 如何在python中创建多个分隔文件?
- flutter - 键入另一个文本字段时,动态文本字段数据将丢失
- r - R编程-如何找到交付数据的频率
- assembly - 在 Atari 2600 代码中如何填充 ROM 的末尾是否重要?
- java - 无法在 macos 上运行 spring boot 项目
- python - 自动化脚本,路径文件夹名称更改
- node.js - Socket.io 仅在快速路由内的 io.on('connection') 函数之外发出
- c++ - 试图理解函数模板