gpt4 book ai didi

python - 匹配多个条件的掩码数据框

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:29 25 4
gpt4 key购买 nike

如果满足两个条件,我想屏蔽(或分配“NA”)数据框中列的值。如果按行执行条件,这将相对简单,例如:

mask = ((df['A'] < x) & (df['B'] < y))
df.loc[mask, 'C'] = 'NA'

但我在弄清楚如何在我的数据框中执行此任务时遇到了一些麻烦,它的结构或多或少类似于:

df = pd.DataFrame({ 'A': (188, 750, 1330, 1385, 188, 750, 810, 1330, 1385),
'B': (2, 5, 7, 2, 5, 5, 3, 7, 2),
'C': ('foo', 'foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'bar', 'bar') })

A B C
0 188 2 foo
1 750 5 foo
2 1330 7 foo
3 1385 2 foo
4 188 5 bar
5 750 5 bar
6 810 3 bar
7 1330 7 bar
8 1385 2 bar

'C' == 'foo' 时,'A' 列中的值也应该在 'C' == 'bar' 时找到(类似于索引),尽管它可能在“foo”和“bar”中都缺少数据。如果“foo”和“bar”均低于 5 或​​其中任何一个缺失,我如何屏蔽(或分配“NA”)列“B”的行?在上面的示例中,输出将类似于:

    A    B C
0 188 2 foo
1 750 5 foo
2 1330 7 foo
3 1385 NA foo
4 188 5 bar
5 750 5 bar
6 810 NA bar
7 1330 7 bar
8 1385 NA bar

最佳答案

这是一种解决方案。这个想法是从两个映射系列 s1s2 构造两个 bool 掩码 m1m2。然后使用 pd.Series.mask屏蔽系列 B

# create separate mappings for foo and bar
s1 = df.loc[df['C'] == 'foo'].set_index('A')['B']
s2 = df.loc[df['C'] == 'bar'].set_index('A')['B']

# use -np.inf to cover missing mappings
m1 = df['A'].map(s1).fillna(-np.inf).lt(5)
m2 = df['A'].map(s2).fillna(-np.inf).lt(5)

df['B'] = df['B'].mask(m1 & m2)

print(df)

A B C
0 188 2.0 foo
1 750 5.0 foo
2 1330 7.0 foo
3 1385 NaN foo
4 188 5.0 bar
5 750 5.0 bar
6 810 NaN bar
7 1330 7.0 bar
8 1385 NaN bar

关于python - 匹配多个条件的掩码数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53824848/

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