python - 修改pandas DataFrame中行子集中的多列

标签 python pandas dataframe

我有一个 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在两者 finalAfinalB对于异常行。

似乎有效的唯一方法是一次做一列:
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/

相关文章:

python - 如何增加 Pandas 图中xticks的大小

python - Python Pandas 合并(和连接)是否无法通过后缀参数重命名列?

python - 将新列插入到数据框中,该数据框根据超过 1 个变量进行计算

Python - 如何查询定义方法的类?

c++ - 在 Windows 中为 python 编译 SWIG 包装器

python - Python 2.7 中的 MySQLdb 错误处理

在 R 中对数据框列进行排名

php - Python中用变量修改参数名

python - 在 pandas MultiIndex 系列中设置值

python - 根据赔率为竞争者分配号码