python 按标头中的字符串和找到的标头的列中的字符串过滤pd.DataFrame

nzrxty8p  于 2023-02-18  发布在  Python
关注(0)|答案(3)|浏览(117)

我正试图找到一种方法,使我能够选择/过滤标题中包含一个特定字符串和列中另一个字符串的列。
我对快速选择列和与所选列相关的行的方法有点困惑。
假设以下 Dataframe df:

Country/Region  Record ID
0   France          118
1   France          110
2   United Kingdom  146
3   United Kingdom  836
4   France          944

我在想:
condition_1 --〉筛选标题condition_2中包含“国家/地区”的列--〉筛选国家/地区为“法国”的行
可以用一个.loc[]和/或def或lambda函数来实现吗?我需要在我的过程中对几个组合和条件进行乘法运算。
我曾试图把以下几点结合起来,但没有成功:
country_condition = lambda df, string: df.filter(regex=string)
df.loc[country_condition==True, :]df[df.filter(regex='Country') == 'France']
所以任何帮助都将不胜感激。
我希望能够给予标题需要包含的字符串(此处为“Country”)和此列的行需要包含的字符串(此处为“France”),以便得到:

Country/Region  Record ID
0   France          118
1   France          110
4   France          944
jmo0nnb3

jmo0nnb31#

一个可能的解决方案,它应该与多列的标题中的Country

df.loc[df.filter(like='Country').eq('France').all(axis=1), :]

输出:

Country/Region  Record ID
0         France        118
1         France        110
4         France        944
wb1gzix0

wb1gzix02#

最简单的方法就是保持数据不变,并以标准方式进行查询:

df[df['Country/Region'] == 'France']

df.filter(regex=...)所做的是选择与正则表达式匹配的数据框列,这与运行df[[i for i in df.columns if re.match(..., i)]]相同,但您说您有多个列,它们可能不都以相同的名称开头:df.filter可能遇到存在多个匹配的问题。

>>> df0 = pd.DataFrame({'country/adjfkl': ['A', 'B', 'C']})
>>> df1 = pd.DataFrame({'country/a1395d': ['B', 'C', 'D']})
>>> pd.concat([d[lambda e: e.filter(regex='^country').eq('B').any(axis=1)] for d in [df0, df1]])
  country/adjfkl country/a1395d
1              B            NaN
0            NaN              B

过滤器的结果可以减少维度与任何横向(即水平)。我不能完全说为什么你会这样做,但是,因为你会留下不一致的列。
最好从一开始就将它们重命名为:

>>> pd.concat(
...     [d.rename(
...         columns=lambda s: re.sub('^country.*', 'country_name', s)).loc[
...         lambda e: e['country_name'] == 'B', :
...     ] for d in [df0, df1]]
... )
  country_name
1            B
0            B
643ylb08

643ylb083#

如果您已经知道要查找的列的列名和值,则只需使用df[df['Country/Region'] == 'France']
但我觉得你的问题要复杂得多。
第一个条件,我们需要列名列表。

cols = [x if 'Country' in x for x in df.cols]

接下来我们检查这些列中的“France”,因为cols是一个列表,所以我们一个接一个地检查并连接结果。

new_df = pd.DataFrame()

for col in cols:
    new_df = pd.concat([new_df, df[df[col] == 'France']])

完整代码示例:

import pandas as pd

df = pd.DataFrame({'Country/Region': ['France', 'France', 'Spain'], 'Record ID': [120, 240, 360]})
cols = [x for x in df.columns if 'Country' in x]

new_df = pd.DataFrame()

for col in cols:
    new_df = pd.concat([new_df, df[df[col] == 'France']])

print(new_df)

印刷品:

Country/Region  Record ID
0         France        120
1         France        240

相关问题