Python 熊猫:为多个列选择具有条件的行
我使用它有条件地选择Python 熊猫:为多个列选择具有条件的行,python,pandas,dataframe,Python,Pandas,Dataframe,我使用它有条件地选择列的行: X.loc[数据['column']==1] 但是我想把这个条件扩展到几列。这些列有一个共同点:它们包含相同的字符串。所以实际上我有一个column1,一个column2column100等,此条件应适用于所有这些列。实际上是这样的(通配符): X.loc[数据['column*']==1] 这些条件应与或链接。是否有机会轻松完成此操作?将每个比较放在括号中,并将其与逻辑运算符组合: pd.DataFrame(X).loc[(data['col1']==23) &a
列的行
:
X.loc[数据['column']==1]
但是我想把这个条件扩展到几列。这些列有一个共同点:它们包含相同的字符串。所以实际上我有一个column1
,一个column2
column100
等,此条件应适用于所有这些列。实际上是这样的(通配符):
X.loc[数据['column*']==1]
这些条件应与
或链接。是否有机会轻松完成此操作?将每个比较放在括号中,并将其与逻辑运算符组合:
pd.DataFrame(X).loc[(data['col1']==23) & (data['col2']==42)] # and
pd.DataFrame(X).loc[(data['col1']==23) | (data['col2']==42)] # or
测试数据帧
创建一个新的dataframe,对所有列进行测试
result_s = d.concat((df['col%i'%i] == 1 for i in range(3)), axis=1).all(axis=1)
导致
0 False
1 True
2 False
dtype: bool
如果你做了df[结果]
你会得到
col0 col1 col2
1 1 1 1
这将选择所有列均为==1
的行。如果其中一行足够,请将.all()
更改为.any
col0 col1 col2
0 1 1 2
1 1 1 1
对于某些数据帧X
p A p B p C
0 0 0 0
1 0 0 0
2 0 0 1
3 0 0 0
4 0 0 0
5 0 0 0
6 1 0 0
如果可以在列列表中设置要测试的列的名称
col_list = X.columns
然后,您可以使用np.any()
对以下各项进行测试:
X.loc[(X[col_list] == 1).any(axis=1)]
这给了你:
p A p B p C
2 0 0 1
6 1 0 0
通知您不需要loc
,并且仍然会得到相同的答案,请将此信息归功于@MaartynFabre
X[(X[col_list] == 1).any(axis=1)]
p A p B p C
2 0 0 1
6 1 0 0
以下是另一种考虑方法:
df
col0 col1 col2
0 1 1 2
1 1 1 1
2 2 2 2
df.loc[df['col0'] == 1, [x for x in df.columns if x == 'col0']]
col0
0 1
1 1
您可以使用列表理解来查找您要查找的列。谢谢:)但我无法对数百列执行此操作。请查看numpy.any()
我问的两个问题与您的问题非常类似:对于您要测试的列列表,请尝试X.loc[(X[col\u list]==1)。any(axis=1)]
@chuckm.loc
不正确needed@MaartenFabré感谢您提供的信息,更新并记入:)看起来不错:)但这通常不起作用,例如,如果这些列命名为columnOne
,columnTwo
等。如果您有列列表,df[(df[选定的_列]==1)。任意(axis=1)]
也可以起作用,而且更有效efficient@scientiaetveritasdf['col%i'%i]==1表示范围(3)中的i
只是一种选择列的方法,具体取决于列的外观,这可能需要修改。你需要在你的问题中提供更多的信息来说明这一点
df
col0 col1 col2
0 1 1 2
1 1 1 1
2 2 2 2
df.loc[df['col0'] == 1, [x for x in df.columns if x == 'col0']]
col0
0 1
1 1