我有一个数据框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列仅为false,但是rec列彼此独立,一个列可能为true,而另一列可能为false。
从理论上讲,如果我要尝试
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'
然后只需将单独的数据帧附加到一个。
我有一种更好的方法来实现这一目标。
答案 0 :(得分:1)
您在正确的道路上。您所做的是创建一个布尔掩码。像这样:
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索引相对应的true / false列表。
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创建掩码。这将给出True异常值的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']