Pandas在索引和条件集上设置数据

时间:2017-05-25 22:45:09

标签: python pandas numpy

无法同时在一组索引和条件上设置数据。执行以下操作的正确方法是什么?

此外,对于此示例,df.index不起任何作用。请假设它代表另一个pandas DataFrame / Series。

import pandas

df = pandas.DataFrame([{'val1': 30, 'val2': 40}, {'val1': 40, 'val2': 20}, {'val1': 50, 'val2': 10}])

# I can do this
df['val1'][df['val2'] == 40] = 1
print df


       val1  val2
    0     1    40
    1    40    20
    2    50    10




# I can even do this
# Sets everything since full index is passed in (same as df['val1'] = 1)
df['val1'].loc[df.index] = 1
print df


       val1  val2
    0     1    40
    1     1    20
    2     1    10




# But I cannot do this?
df['val1'].loc[df.index][df['val2'] == 20] = 1
print df


       val1  val2
    0    30    40
    1    40    20
    2    50    10

这是使用pandas 0.19.2

1 个答案:

答案 0 :(得分:1)

我碰巧遇到同样的问题,我想根据索引和特定条件选择行。不确定我是否找到了最佳解决方案,但这是我的想法:我将我的行选择合并为一个布尔数组,然后将其传递给.loc.iloc[]如果您确实想要选择所有行,则df.index实际上是不必要的。否则,我假设您可以将您的选择转换为索引列表,例如[1, 2]。我修改了你的例子:

import pandas

df = pandas.DataFrame([{'val1': 30, 'val2': 20}, {'val1': 40, 'val2': 20}, 
                       {'val1': 50, 'val2': 10}])
print df

   val1  val2
0    30    20
1    40    20
2    50    10

# Set data
row_selection = (df['val2'] == 20) & df.index.isin([1, 2])
df['val1'][row_selection] = 1
print df

   val1  val2
0    30    20
1     1    20
2    50    10

稍微澄清一下:

  • 第1行保持不变,即使其'val2'20;
  • 第3行保持不变,即使选择了第3行(df.index.isin([1, 2]));
  • 'val2'保持不变;
  • 仅第2行,'val1'已更改。
  • 您当然可以通过这种方式组合多个条件。