我有一个数据帧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列可能永远不会全部为false。
我也考虑过像这样一次做一列。
df_blue_rec_1 = df['type']=='blue' & df['rec_1_outlier']=='False'
df_blue_rec_2 = df['type']=='blue' & df['rec_2_outlier']=='False'然后,只需将单独的数据帧添加到一个数据帧中。
我有一种感觉,有一种更好的方法来实现这一点。
发布于 2020-05-13 23:20:31
你走在正确的道路上。您所做的是创建一个布尔掩码。如下所示:
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_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']https://stackoverflow.com/questions/61777954
复制相似问题