Python 如果子字符串列表中的任何值包含在数据帧中的任何列中,则筛选行
假设我有一个数据帧df,如下所示:Python 如果子字符串列表中的任何值包含在数据帧中的任何列中,则筛选行,python,pandas,dataframe,substring,Python,Pandas,Dataframe,Substring,假设我有一个数据帧df,如下所示: df = pd.DataFrame({'Index': [1, 2, 3, 4, 5], 'Name': ['A', 'B', 100, 'C', 'D'], 'col1': [np.nan, 'bbby', 'cccy', 'dddy', 'EEEEE'], 'col2': ['water', np.nan, 'WATER', 'soil', '
df = pd.DataFrame({'Index': [1, 2, 3, 4, 5],
'Name': ['A', 'B', 100, 'C', 'D'],
'col1': [np.nan, 'bbby', 'cccy', 'dddy', 'EEEEE'],
'col2': ['water', np.nan, 'WATER', 'soil', 'cold air'],
'col3': ['watermelone', 'hot AIR', 'air conditioner', 'drink', 50000],
'Results': [1000, 2000, 3000, 4000, 5000]})
Out
Index Name col1 col2 col3 Results
1 A NaN water watermelone 1000
2 B bbbY NaN hot AIR 2000
3 100 cccY water air conditioner 3000
4 C dddf soil drink 4000
5 D EEEEE cold air 50000 5000
我有一个列表:matches=['wat','air']
如何选择col1
或col2
或col3
中包含I
匹配项的所有行
预期产出:
Index Name col1 col2 col3 Results
1 A NaN water watermelone 1000
2 B bbbY NaN hot AIR 2000
3 100 cccY water air conditioner 3000
5 D EEEEE cold air 50000 5000
您可以使用
.T
转换数据帧,使用str.contains
按列检查值,然后再转换回原来的值(如果用|
分隔,则str.contains
可以传递多个值,这就是为什么我将列表更改为带有matches='.''.'的字符串。连接(matches)
)
转置数据帧的好处是,您可以使用列方式,而不是通过行或长的lambda x:
列表循环与轴=1的λx
相比,此技术应具有良好的性能
答案:
# df = df.set_index('Index')
matches = ['wat','air']
matches = '|'.join(matches)
df = df.reset_index(drop=True).T.fillna('')
df = df.T[[df[col].str.lower().str.contains(matches).values.any() for col in df.columns]]
df
Out[1]:
Name col1 col2 col3
0 A water watermelone
1 B bbbY hot AIR
2 B cccY water air conditioner
4 D EEEEE cold air eat
也可以尝试以下方法:
df = df[df['col1'].str.contains('|'.join(matches))|df['col2'].str.contains('|'.join(matches))|df['col3'].str.contains('|'.join(matches))]
印刷品:
Name col1 col2 col3
1 A aadY water watermelone
2 B bbbY air hot AIR
3 B cccY water air conditioner
5 D EEEEE cold air eat
@Joe你能把
df=df.T
改成df=df.T.fillna(“”)
——看看我更新的答案吗。@Joe我看到你更新了你的问题。我添加了.fillna(“”)
来处理空格,并将case=False
传递给str.contains()
来忽略大小写。你好@David Erickson,谢谢。我运行了另一个大数据集,给了我“[Float64Index([nan,nan,nan,nan,nan,nan,nan,nan,\n nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan,nan)]都不在[columns]中”
@Joe看起来你的索引上有一个float和nan。请参阅我的最新答案。我用.reset\u index(drop=True)
Hi@David Erickson重置了索引,似乎是因为我的数据库中有浮点数,无法匹配字符串。我添加了df=df.applymap(str)
。好的。非常感谢!!!