如何为数据框中的每一行的不同列分配值?

时间:2014-03-19 22:15:00

标签: python pandas

我有一个如下所示的数据框dat

        p1    p2    type  replace
1       0     1     1     1
2       1     0     1     1
3       0     0     2     1
...

我想做dat['p + str(type)'] = replace之类的事情来获取:

        p1    p2    type  replace 
1       1     1     1     1
2       1     0     1     1
3       0     1     2     1
...

我该怎么做?当然我不能使用像iterrows这样的东西进行循环分配......

3 个答案:

答案 0 :(得分:0)

也许有一个衬垫可以做到这一点,但如果性能不是真正的问题,你可以通过简单的for循环轻松完成:

In [134]: df
Out[134]: 
   p1  p2  type  replace
0   0   1     1        1
1   1   0     1        1
2   0   0     2        1

In [135]: for i in df.index:
     ...:     df.loc[i, 'p'+str(df.loc[i, 'type'])] = df.loc[i, 'replace']

In [136]: df
Out[136]: 
   p1  p2  type  replace
0   1   1     1        1
1   1   0     1        1
2   0   1     2        1

如果你有更多的行而不是列,这将更快,实际上更容易(如果有必要,你可以循环1,2,...):

df["p1"][df["type"]==1] = df["replace"][df["type"]==1]
df["p2"][df["type"]==2] = df["replace"][df["type"]==2]

答案 1 :(得分:0)

In [47]: df['p1'].where(~(df['type'] == 1), df['replace'], inplace=True)

In [48]: df['p2'].where(~(df['type'] == 2), df['replace'], inplace=True)

In [49]: df
Out[49]: 
   p1  p2  type  replace
1   1   1     1        1
2   1   0     1        1
3   0   1     2        1

答案 2 :(得分:0)

为了完整起见,我最终做了以下工作,这可能与Dan Allan建议的相同或不同:

for i in range(2):
    df.loc[df['type'] == i + 1, 'p' + str(i + 1)] = df.loc[df['type'] == i + 1, 'replace']

我遇到的问题远比我给出的例子(数据框中有30种类型和数千行),这个解决方案看起来非常快。感谢大家帮忙思考这个问题!