无法同时在一组索引和条件上设置数据。执行以下操作的正确方法是什么?
此外,对于此示例,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
答案 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
稍微澄清一下:
'val2'
为20
; df.index.isin([1, 2])
); 'val2'
保持不变; 'val1'
已更改。