我想根据列名替换另一个系列中pandas数据框中的值。我有这个人。数据帧:
Y2000 Y2001 Y2002 Y2003 Y2004 Item Item Code
34 43 0 0 25 Test Val
我还有另一个系列:
Y2000 41403766
Y2001 45283735
Y2002 47850796
Y2003 38639101
Y2004 45226813
如何根据第二个系列中的值替换第一个数据框中的值?
- 更多编辑: 要重新创建问题,代码和数据位于:umd.box.com/s/hqd6oopj6vvp4qvpwnj8r4lm3z7as4i3
运行代码的说明:
运行此代码:
将config_rotations.txt中的data_dir替换为输入目录的路径,即保存文件的位置
将config_rotations.txt中的out_dir替换为您想要的输出路径
运行python代码\ crop_stats.py。问题出在crop_stats.py
- 编辑:
根据@ Andy的查询,这是我想要的结果:
Y2000 Y2001 Y2002 Y2003 Y2004 Item Item Code
41403766 45283735 47850796 38639101 45226813 Test Val
我试过
df_a.replace(df_b)
但这不会改变df_a
中的任何值答案 0 :(得分:1)
您可以在重新整形后覆盖系列中的df并覆盖列:
In [85]:
df1[s.index] = pd.DataFrame(columns = s.index, data = s.values.reshape(1,5))
df1
Out[85]:
Y2000 Y2001 Y2002 Y2003 Y2004 Item Item Code
0 41403766 45283735 47850796 38639101 45226813 Test Val
因此,这使用系列索引值从df中进行子选择,然后从同一系列构造一个df,这里我们必须重新整形数组以生成单行df
修改强>
我上面的代码无法处理您的真实代码的原因首先是在分配时您无法执行此操作:
df.loc[(df['Country Code'] == replace_cnt) & (df['Item'] == crop)][s.index]
这称为链式索引并发出警告,请参阅docs。
因此,要更正此问题,您可以将列放在[]
:
df.loc[(df['Country Code'] == replace_cnt) & (df['Item'] == crop),s.index]
此外,pandas尝试沿着索引值和列名对齐,如果它们不匹配,那么您将获得NaN
值,这样您就可以通过调用.values
来解决这个问题。得到一个np数组,它只是变成没有索引或列标签的匿名数据,只要数据形状是broadcast-able,那么它就会做你想要的:
df.loc[(df['Country Code'] == replace_cnt) & (df['Item'] == crop),s.index] = pd.DataFrame(columns=s.index, data=s.values.reshape(1, len(s.index))).values