python - 就地添加新值和列
问题描述
我有一个看起来像这样的数据框:
Front jvol Back jvol
row col
99 49 5734 5850
50 5735 5851
51 5736 5852
52 5737 5853
和字典,如:
dict =
{5734: 1,
5735: 0,
5736: 1,
5737: 1,
5850: -1,
5851: 0,
5852: -1,
5853: -1}
我正在尝试在每个列值上运行字典并在新列中返回结果,如下所示:
Front jvol Back jvol Front jvol_d Back jvol_d
row col
99 49 5734 5850 1 -1
50 5735 5851 0 0
51 5736 5852 1 -1
52 5737 5853 1 -1
我试过这个:
columns = ['Front jvol', 'Back jvol']
columns_d = ['Front jvol_d', 'Back jvol_d']
df = pd.concat([df, pd.DataFrame(columns = columns_d)])
for col_d, col in zip(columns_d, columns):
for ivol in range(len(df[col])):
try:
df[col_d][ivol] = dict[df[col][ivol]]
except:
pass
但结果很奇怪。它改变了其他列的格式并给出了SettingWithCopyWarning
警告:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df[col_d][ivol] = dict[df[col][ivol]]
Front jvol Back jvol Front jvol_d Back jvol_d
row col
99 49 5734.0 5850.0 1 -1
50 5735.0 5851.0 0 0
51 5736.0 5852.0 1 -1
52 5737.0 5853.0 1 -1
解决方案
首先重命名 variable dict
,因为 python 代码字为d
or dict1
,然后使用DataFrame.replace
- 如果没有匹配得到原始值:
d =
{5734: 1,
5735: 0,
5736: 1,
5737: 1,
5850: -1,
5851: 0,
5852: -1,
5853: -1}
df = df.join(df.replace(d).add_prefix('_d'))
或者Series.map
- 如果没有匹配值得到NaN
:
df = df.join(df.stack().map(d).unstack().add_prefix('_d'))
如果值始终与 dict 匹配,则两个解决方案都使用相同的输出。
推荐阅读
- r - BlueSky Statistics - String to date [time] 问题
- macos - 以编程方式禁用“摇动以查找指针”MacOS 功能而不隐藏光标
- laravel - Laravel 2 以相同的形式提交按钮
- java - 如何在 macOS 上为 IntelliJ 项目安装 Google OR-Tools
- git - git将未更改的文件添加到“未暂存的文件”中
- c++ - g++ 无法解决模板函数重载
- python-3.x - Python:导入日历错误给出了意想不到的结果
- python - 熊猫将列从一个数据框复制到另一个具有不同名称的数据框
- vue.js - VueJS 如何在方法中访问 Mounted() 变量
- php - ajax的成功函数不返回数据库中的所有行