python - Pandas - 根据多个条件过滤数据框
问题描述
我有一个数据框df:
type rec_1 rec_2 rec_3 rec_4 rec_1_outlier rec_2_outlier rec_3_outlier rec_4_outlier
yellow 1 7 3 1 FALSE TRUE TRUE TRUE
red 3 11 2 5 FALSE TRUE FALSE FALSE
blue 5 2 1 6 TRUE FALSE FALSE FALSE
green 2 9 13 9 FALSE FALSE TRUE FALSE
我想为每种类型获取单独的数据帧,其中 _outlier 列仅为假,但 rec 列彼此独立,一列可能为真,另一列为假。
所以理论上如果我要尝试
df_blue = df['type']=='blue' & df['rec_1_outlier']=='False' & df['rec_2_outlier']=='False' & df['rec_3_outlier']=='False' & df['rec_4_outlier']=='False'
这可能永远不会选择任何行,因为 _outlier 列可能永远不会全部为假。
我也想过像这样一次写一篇专栏。
df_blue_rec_1 = df['type']=='blue' & df['rec_1_outlier']=='False'
df_blue_rec_2 = df['type']=='blue' & df['rec_2_outlier']=='False'
然后只需将单独的数据框附加到一个中。
我有这种感觉,好像有更好的方法来实现这一点。
解决方案
你走在正确的道路上。你所做的是创建一个布尔掩码。像这样:
mask_blue =((df['type']=='blue') &
(df['rec_1_outlier']=='False') &
(df['rec_2_outlier']=='False') &
(df['rec_3_outlier']=='False') &
(df['rec_4_outlier']=='False')
此掩码提供与原始 df 的索引相对应的真/假列表。
df_blue = df.loc[mask_blue,:]
现在,您可以通过更改上面的 (:) 来选择要传输到 df_blue 的列。例如:
df_blue = df.loc[mask_blue,['type','rec_1']]
这将给出一个带有列的df:type
和rec_1
更新
要为每个单独的 rec_1 执行此操作,请尝试为每个 rec_x 创建掩码。这将为真正的异常值提供 nan 值。以下代码是rec_1 和rec_2 的示例。
df_blue = pd.Datafram()
mask_blue1 =((df['type']=='blue') & (df['rec_1_outlier']=='False'))
df_blue.loc[:,'rec_1'] = df.loc[mask_blue1,'rec_1']
mask_blue2 =((df['type']=='blue') & (df['rec_2_outlier']=='False'))
df_blue.loc[:,'rec_2'] = df.loc[mask_blue2,'rec_2']
推荐阅读
- javascript - Vue/nuxt - 如何从子组件访问父级引用
- jquery - 如何在另一个具有多个 contentEditable div 的 div 中识别活动的 contentEditable div
- reactjs - antd表格排序忽略children
- c# - 从 Prefab 中的 Sprite 获取 Animator (Unity)
- c# - 过滤不包含所有类型元素的组的有效方法
- java - How to re-ask the user to enter Yes or No?
- c++ - OpenGl transparency not working despite setting up blend function
- python-3.x - Binance API data user stream not receiving any data
- java - 如何在我的 Java 代码中替换递归?
- prometheus - How to set a retention time for Pushgateway for metrics to expire?