根据列名替换pandas数据帧中的值

时间:2015-09-22 20:19:02

标签: python pandas

我想根据列名替换另一个系列中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

运行代码的说明:

运行此代码:

  1. 将config_rotations.txt中的data_dir替换为输入目录的路径,即保存文件的位置

  2. 将config_rotations.txt中的out_dir替换为您想要的输出路径

  3. 运行python代码\ crop_stats.py。问题出在crop_stats.py

  4. 的第133行

    - 编辑:

    根据@ Andy的查询,这是我想要的结果:

    Y2000      Y2001   Y2002     Y2003      Y2004          Item    Item Code
    41403766  45283735 47850796  38639101  45226813     Test      Val
    

    我试过

    df_a.replace(df_b)
    

    但这不会改变df_a

    中的任何值

1 个答案:

答案 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