Python Pandas:根据多索引数据帧子集的条件设置值的正确方法
我不知道如何在没有链式作业的情况下做到这一点(这可能无论如何都不起作用,因为我要设置一个副本) 我不想获取多索引数据帧的子集,测试小于零的值并将其设置为零 例如:Python Pandas:根据多索引数据帧子集的条件设置值的正确方法,python,pandas,multi-index,Python,Pandas,Multi Index,我不知道如何在没有链式作业的情况下做到这一点(这可能无论如何都不起作用,因为我要设置一个副本) 我不想获取多索引数据帧的子集,测试小于零的值并将其设置为零 例如: 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')
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
这表明它无法根据条件进行设置。或者,如果我做了链式作业:
df.loc[:,'A'][df['A']<0] = 0.0
但不知何故,我觉得有一个更好的方法来做这件事,而不是通过循环列。在pandas中这样做的最佳方式是什么?这是的应用程序(也是使用多索引切片器的主要动机之一),请参阅文档
[20]中的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,0100200]})
In[21]:df
出[21]:
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
在[22]中:idx=pd.indexlice
在[23]:mask=df.loc[:,idx['A',:]]啊,好的,谢谢!使用切片器创建掩码看起来非常有用(可能需要在我的更多代码中使用)。第二个例子确实解决了我的具体问题。我不知道df['A']
和df['A']]
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
In [64]:
df
Out[64]:
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
In [20]: 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]})
In [21]: df
Out[21]:
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
In [22]: idx = pd.IndexSlice
In [23]: mask = df.loc[:,idx['A',:]]<0
In [24]: mask
Out[24]:
A
a b
0 True False
1 True False
2 False False
3 False False
4 False True
In [25]: df[mask] = 0
In [26]: df
Out[26]:
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
In [30]: df[df[['A']]<0] = 0
In [31]: df
Out[31]:
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