2017-05-25 73 views
0

难以同时设置一组索引和条件的数据。什么是正确的方式来做到以下几点?熊猫设置索引和条件集的数据

此外,对于此示例,df.index不起任何作用。请假设它代表另一个熊猫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 

这是利用熊猫0.19.2

+0

'.loc [df.index]'应该做什么? –

回答

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行(df.index.isin([1, 2])),第3行仍保持不变;
  • 'val2'保持不变;
  • 只有第2行'val1'被更改。
  • 您当然可以通过这种方式组合多个条件。
+0

是否有必要做'as_matrix'?无论在两个数组之间,它都应该执行'和'。 – jab

+0

另外,在执行'df.loc [myindexes]'与'df.isin [myindexes]'之间的性能影响的任何想法? – jab

+0

@jab是的,你是对的。 'as_matrix'没有必要。刚更新了我的帖子。 –