我有一个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范围的True
或False
值(Params_1
、Params_2
和Params_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