如何在df.at

时间:2018-05-31 08:59:04

标签: python pandas dataframe

我有一个像这样的数据框,

   a   b   c
0  1   6  11
1  2   7  12
2  3   8  13
3  4   9  14
4  5  10  15

,另一个数据框看起来像这样,

  column  index
0      a      0
1      b      2
2      c      4

在第二个数据框中它包含索引和列,从这个df我想访问第一个df并将此[row,column]值替换为1996.

我试过了,

df.at[df_index['index'],df_index['column']]=1996

      a     b     c
0  1996  1996  1996
1     2     7    12
2  1996  1996  1996
3     4     9    14
4  1996  1996  1996

但没有按预期工作,

当我尝试这样做时,它会起作用,

for v in df_index.values:
    df.at[v[1],v[0]]=1996

      a     b     c
0  1996     6    11
1     2     7    12
2     3  1996    13
3     4     9    14
4     5    10  1996

问题:

  1. 为什么我的第一次尝试失败

  2. 以pythonic方式实现此目标的最小方法是什么。

1 个答案:

答案 0 :(得分:1)

pd.DataFrame.atpd.DataFrame.iat用于访问和设置标量值。因此,您需要遍历(行,列)标签的每个组合以通过这些方法设置值。您无法将系列或数组提供给这些索引器。

一种可能性是提取numpy数组表示,使用矢量化索引来更新数组,然后输入pd.DataFrame

vals = df.values
cols = df.columns.get_loc

vals[df_index['index'], df_index['column'].map(cols)] = 1996

res = pd.DataFrame(vals, index=df.index, columns=df.columns)

print(res)

      a     b     c
0  1996     6    11
1     2     7    12
2     3  1996    13
3     4     9    14
4     5    10  1996