我有一个如下所示的数据框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这样的东西进行循环分配......
答案 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种类型和数千行),这个解决方案看起来非常快。感谢大家帮忙思考这个问题!