如果满足两个条件,我想掩码(或指定’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’==’bar'(类似索引)时,也应该找到’C’=”foo’时’A’列中的值,尽管它’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
解决方法:
这是一个解决方案.我们的想法是从两个映射系列s1和s2构造两个布尔掩码m1和m2.然后用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。