Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果子字符串列表中的任何值包含在数据帧中的任何列中,则筛选行_Python_Pandas_Dataframe_Substring - Fatal编程技术网

Python 如果子字符串列表中的任何值包含在数据帧中的任何列中,则筛选行

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,如下所示:

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)
。好的。非常感谢!!!