我想取一个MultiIndex pandas dataframe的子集,测试小于零的值并将其设置为零。
例如:
df = pd.DataFrame({('A','a'): [-1,-1,0,10,12],
('A','b'): [0,1,2,3,-1],
('B','a'): [-20,-10,0,10,20],
('B','b'): [-200,-100,0,100,200]})
df[df['A']<0] = 0.0
给予
A B
a b a b
0 -1 0 -20 -200
1 -1 1 -10 -100
2 0 2 0 0
3 10 3 10 100
4 12 -1 20 200
这表明它无法根据条件进行设置。或者,如果我做链式赋值:
df.loc[:,'A'][df['A']<0] = 0.0
这给出了相同的结果(并且设置有复制警告)。
我可以根据第一个级别是我想要的级别的条件循环遍历每一列:
for one,two in df.columns.values:
if one == 'A':
df.loc[df[(one,two)]<0, (one,two)] = 0.0
这给出了期望的结果:
A B
a b a b
0 0 0 -20 -200
1 0 1 -10 -100
2 0 2 0 0
3 10 3 10 100
4 12 0 20 200
在Pandas身上做这件事的最好方法是什么?
2条答案
按热度按时间a11xaf1n1#
这是的一个应用程序(也是使用MultiIndex切片器的主要动机之一),请参阅此处的文档
因为你正在使用列索引的第一级,下面的例子也可以工作。上面的例子更一般,假设你想为'a'做这个。
mctunoxg2#
您还可以使用内置的
slice()
函数。例如,要选择'A'
列,请使用slice(None)
创建一个tuple(pandas将tuple解释为MultiIndex),以表明您希望第二层(('A', slice(None))
)中的所有内容。在第二层做选择列;例如,选择所有
'a'
列,使用(slice(None), 'a')
,其中slice(None)
表示您不关心第一级中的内容。