gpt4 book ai didi

python - Pandas : Proper way to set values based on condition for subset of multiindex dataframe

转载 作者:IT老高 更新时间:2023-10-28 21:13:09 24 4
gpt4 key购买 nike

我不确定如何在没有链式分配的情况下执行此操作(这可能无论如何都行不通,因为我要设置一个副本)。

我不想获取多索引 pandas 数据帧的子集,测试小于零的值并将它们设置为零。

例如:

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

给予

In [37]:

df

Out[37]:
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

它给出了预期的结果:

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

但不知何故,我觉得有比遍历列更好的方法来做到这一点。在 pandas 中执行此操作的最佳方法是什么?

最佳答案

这是一个应用程序(也是使用 MultiIndex 切片器的主要动机之一),请参阅文档 here

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

由于您正在使用第一级的列索引,因此以下内容也可以使用。上面的例子更笼统,假设你想为 'a' 做这个。

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

关于python - Pandas : Proper way to set values based on condition for subset of multiindex dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28002197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com