Python 如何根据多个列中的单个值从多索引中进行选择?
我创建了一个数据帧,如下所示:Python 如何根据多个列中的单个值从多索引中进行选择?,python,pandas,select,multi-index,Python,Pandas,Select,Multi Index,我创建了一个数据帧,如下所示: import pandas as pd df = pd.DataFrame({ 'ind1': list('AAABBBCCC'), 'ind2': list(map(int, list('123123123'))), 'val1': [0, 0, 0, -1, -4, 5, 10, 11, 4], 'val2': [0.1, 0.2, -0.2, 0.1, 0.2, 0.2, -0.1, 2, 0.1] }) df = df.
import pandas as pd
df = pd.DataFrame({
'ind1': list('AAABBBCCC'),
'ind2': list(map(int, list('123123123'))),
'val1': [0, 0, 0, -1, -4, 5, 10, 11, 4],
'val2': [0.1, 0.2, -0.2, 0.1, 0.2, 0.2, -0.1, 2, 0.1]
})
df = df.set_index(['ind1', 'ind2'])
结果数据:
val1 val2
ind1 ind2
A 1 0 0.1
2 0 0.2
3 0 -0.2
B 1 -1 0.1
2 -4 0.2
3 5 0.2
C 1 10 -0.1
2 11 2.0
3 4 0.1
我想选择所有条目,其中:
val1中至少有一项不等于0
val2中的每个绝对值均<0.5
因此,在上面的示例中
B 1 -1 0.1
2 -4 0.2
3 5 0.2
应该保留
我不能使用sum,因为值可以是正的,也可以是负的,所以像这样
df.reset_index().groupby('ind1').sum()
ind2 val1 val2
ind1
A 6 0 0.1
B 6 0 0.5
C 6 25 2.0
这是行不通的
在这里如何使用any and all?一种方法是通过groupby.filter,它对每个组(相对于每个数据帧行)计算布尔条件:
df.groupby('ind1').filter(lambda x: x['val1'].any() &
(x['val2'].abs() < 0.5).all())
val1 val2
ind1 ind2
B 1 -1 0.1
2 -4 0.2
3 5 0.2
请注意,DataFrame.groupby.filter与同名方法DataFrame.filter无关 一种方法是通过groupby.filter,它计算每个组上的布尔条件,而不是每个数据帧行:
df.groupby('ind1').filter(lambda x: x['val1'].any() &
(x['val2'].abs() < 0.5).all())
val1 val2
ind1 ind2
B 1 -1 0.1
2 -4 0.2
3 5 0.2
请注意,DataFrame.groupby.filter与同名方法DataFrame.filter无关 无lambda变换
无lambda变换
这对我很有效,类似于温家宝的解决方案:
mask = df.abs().groupby(level=0).transform('max')
df[mask.val1.gt(0)&mask.val2.lt(0.5)]
输出:
val1 val2
ind1 ind2
B 1 -1 0.1
2 -4 0.2
3 5 0.2
这对我很有效,类似于温家宝的解决方案:
mask = df.abs().groupby(level=0).transform('max')
df[mask.val1.gt(0)&mask.val2.lt(0.5)]
输出:
val1 val2
ind1 ind2
B 1 -1 0.1
2 -4 0.2
3 5 0.2
您正在查找所有满足筛选条件的ind1条目?@blueberryfields:是的,这就是目标。我的错误。。。现在我丢失了真正的副本。您只是在寻找一个复合过滤器-尝试在浏览器中搜索该短语。@Prune:没问题。如果你发现了真实的副本,请随意发布并再次关闭问题。也许还可以删除downvoteYou正在查找所有满足筛选条件的ind1条目?@blueberryfields:是的,这就是目标。我的错误。。。现在我丢失了真正的副本。您只是在寻找一个复合过滤器-尝试在浏览器中搜索该短语。@Prune:没问题。如果你发现了真实的副本,请随意发布并再次关闭问题。也许还可以取消否决票