gpt4 book ai didi

python - 从多索引中选择时如何避免链式应用?

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:42 24 4
gpt4 key购买 nike

我有一个这样的数据框:

import numpy as np
import pandas as pd


df = pd.DataFrame({
'ind1': list('AAABBBCCC'),
'ind2': list(map(int, list('123123123'))),
'val1': [0, 1, 2, -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 1 0.2
3 2 -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 中的值之差的绝对值正在增加的条目。

我目前是这样做的:

m_incr = (
df.groupby('ind1')['val1']
.apply(lambda x: np.diff(abs(x)))
.apply(lambda x: all(eli > 0 for eli in x))
)

df_incr = df[m_incr[df.index.get_level_values('ind1')].values]

这给了我想要的结果:

           val1  val2
ind1 ind2
A 1 0 0.1
2 1 0.2
3 2 -0.2
B 1 -1 0.1
2 -4 0.2
3 -5 0.2

我的问题是是否有更直接/有效的方法来避免链式 apply

最佳答案

使用GroupBy.transform返回与原始 DataFrame 大小相同的 Series:

mask = df.groupby('ind1')['val1'].transform(lambda x: (np.diff(abs(x)) > 0).all())

然后使用 boolean indexing 按掩码过滤:

print (df[mask])

一起:

print (df[df.groupby('ind1')['val1'].transform(lambda x: (np.diff(abs(x)) > 0).all())])

           val1  val2
ind1 ind2
A 1 0 0.1
2 1 0.2
3 2 -0.2
B 1 -1 0.1
2 -4 0.2
3 -5 0.2

详细信息:

print (mask)
ind1 ind2
A 1 True
2 True
3 True
B 1 True
2 True
3 True
C 1 False
2 False
3 False
Name: val1, dtype: bool

关于python - 从多索引中选择时如何避免链式应用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57072110/

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