我有一个 Pandas 数据帧。在这个 DataFrame 中,我想修改一些行的几列。这些是我尝试过的方法。
df[['finalA', 'finalB']] = df[['A', 'B']]
exceptions = df.loc[df.normal == False]
这就像一个魅力,但现在我想设置异常(exception):
df.loc[exceptions.index, ['finalA', 'finalB']] = \
df.loc[exceptions.index, ['A_except', 'B_except']]
哪个不起作用。所以我尝试使用
.ix
来自 this answer .df.ix[exceptions.index, ['finalA', 'finalB']] = \
df.ix[exceptions.index, ['A_except', 'B_except']]
这也行不通。两种方法都给我
NaN
在两者 finalA
和 finalB
对于异常行。似乎有效的唯一方法是一次做一列:
df.ix[exceptions.index, 'finalA'] = \
df.ix[exceptions.index, 'A_except']
df.ix[exceptions.index, 'finalB'] = \
df.ix[exceptions.index, 'B_except']
Pandas 这里发生了什么?如何避免将值设置为显然是通过选择多列制作的副本?有没有办法避免这种代码重复?
更多思考:它实际上并没有将值设置为数据帧的副本,而是将值设置为 NaN。它实际上将它们覆盖为一个新值。
示例数据框:
import pandas as pd
df = pd.DataFrame({'A': [1,2,3,4],
'B': [5,6,7,8],
'normal': [True, True, False, False],
'A_except': [0,0,9,9],
'B_except': [0,0,10,10]})
结果:
A A_except B B_except normal finalA finalB
0 1 0 5 0 True 1.0 5.0
1 2 0 6 0 True 2.0 6.0
2 3 9 7 10 False NaN NaN
3 4 9 8 10 False NaN NaN
预期结果:
A A_except B B_except normal finalA finalB
0 1 0 5 0 True 1 5
1 2 0 6 0 True 2 6
2 3 9 7 10 False 9 10
3 4 9 8 10 False 9 10
最佳答案
您可以重命名列名称以进行对齐:
d = {'A_except':'finalA', 'B_except':'finalB'}
df.loc[exceptions.index, ['finalA', 'finalB']] = \
df.loc[exceptions.index, ['A_except', 'B_except']].rename(columns=d)
print (df)
A A_except B B_except normal finalA finalB
0 1 0 5 0 True 1 5
1 2 0 6 0 True 2 6
2 3 9 7 10 False 9 10
3 4 9 8 10 False 9 10
另一种解决方案是将输出转换为
numpy array
,但列不对齐:df.loc[exceptions.index, ['finalA', 'finalB']] = \
df.loc[exceptions.index, ['A_except', 'B_except']].values
print (df)
A A_except B B_except normal finalA finalB
0 1 0 5 0 True 1 5
1 2 0 6 0 True 2 6
2 3 9 7 10 False 9 10
3 4 9 8 10 False 9 10
关于python - 修改pandas DataFrame中行子集中的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42553621/