Pandas根据bool值在一系列列中按位置选择行



我有一个df

Name   Param_1   Param_2   Param_3
John   True      False     False 
Mary   False     False     False
Peter  True      False     False 
Linda  False     False     True 

我想基于跨colunms范围的TrueFalse值(Params_1Params_2Params_3(创建两个新的数据帧。像这样的。。。

df_1 =
Name   Param_1   Param_2   Param_3
John   True      False     False
Peter  True      False     False
Linda  False     False     True
df_2 = 
Name   Param_1   Param_2   Param_3
Mary   False      False     False

然而,每次运行代码时,我都不知道Param_1等的名称,所以我想使用正索引(切片(。在这种情况下,[:, 1:]

我看到过一些例子,当列具有已知名称时,根据一列中的值来选择行,但不是通过按位置在多列之间进行切片。

我试过ais_gdf.iloc[ais_gdf[:, 1:].isin(False)],但没用。感谢您的帮助。

使用DataFrame.iloc为掩码选择列,并通过DataFrame.any测试是否至少有一个True,然后通过boolean indexing进行过滤,对于df_2,通过~:反转掩码

m = ais_gdf.iloc[:, 1:].any(axis=1)
#alternative for select only boolean columns
#m = ais_gdf.select_dtypes(bool).any(axis=1)
#alternative1 for columns names with with Param
#m = ais_gdf.filter(like='Param').any(axis=1)
df_1 = ais_gdf[m]
df_2 = ais_gdf[~m]
print (df_1)
Name  Param_1  Param_2  Param_3
0   John     True    False    False
2  Peter     True    False    False
3  Linda    False    False     True
print (df_2)
Name  Param_1  Param_2  Param_3
1  Mary    False    False    False

使用select_dtypes获取布尔列。创建一个遮罩,然后使用此遮罩进行筛选。

mask = (~df.select_dtypes(bool)).all(axis=1)
df1 = df[mask]
Name  Param_1  Param_2  Param_3
1  Mary    False    False    False
df2 = df[~mask]
Name  Param_1  Param_2  Param_3
0   John     True    False    False
2  Peter     True    False    False
3  Linda    False    False     True

最新更新