Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas:根据多索引数据帧子集的条件设置值的正确方法_Python_Pandas_Multi Index - Fatal编程技术网

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