【问题标题】:pandas filter by two columns (python)pandas 按两列过滤(python)
【发布时间】:2018-12-27 03:05:59
【问题描述】:

我有一个包含很多列的 pandas DataFrame (df),其中两个是“Year”和“col_1”

我还有一个总结在一个列表中的提取标准(Criteria):

[1234,5432,...,54353,654,1234]。

如果满足以下条件,我想提取此 DataFrame 的子集:

((df.Year==1990) & (df.col_1>=Criteria[0])) or

((df.Year==1991) & (df.col_1>=Criteria[1])) or

((df.Year==1992) & (df.col_1>=Criteria[2])) or 

...

((df.Year==2010) & (df.col_1>=Criteria[20])) or

((df.Year==2011) & (df.col_1>=Criteria[21]))

虽然我可以列出这些标准的所有组合,但我想 用短短一行代码完成此操作,例如:

df = df[df[['col_1','col_2']].apply(lambda x: f(*x), axis=1)]

(来自how do you filter pandas dataframes by multiple columns

请告诉我该怎么做。谢谢。

【问题讨论】:

  • 你能发布你的数据框吗?和你的标准列表?
  • 您可以添加使用您指定的 lambda 函数生成的列 rank,然后对您的排名列进行排序
  • @user3483203 您可以在下面的答案中使用标准列表。和我的格式一样。
  • @oberron 在这种情况下我应该如何编写 lambda 函数?

标签: python pandas filter multiple-columns


【解决方案1】:

Sample DataFrame:

df = pd.DataFrame({'col_1':[2000,1,54353,5],
                   'Year':[1990,1991,1992,1993],
                   'a':range(4)})

print (df)
   col_1  Year  a
0   2000  1990  0
1      1  1991  1
2  54353  1992  2
3      5  1993  3

按条件和年份组合创建助手dictionary

Criteria = [1234,5432,54353,654,1234]
years = np.arange(1990, 1990 + len(Criteria))
d = dict(zip(years, Criteria))
print (d)
{1990: 1234, 1991: 5432, 1992: 54353, 1993: 654, 1994: 1234}

year 列最后map 并按boolean indexing 过滤:

df = df[df['col_1'] >= df['Year'].map(d)]
print (df)
   col_1  Year  a
0   2000  1990  0
2  54353  1992  2

详情

print (df['Year'].map(d))
0     1234
1     5432
2    54353
3      654
Name: Year, dtype: int64

print (df['col_1'] >= df['Year'].map(d))

0     True
1    False
2     True
3    False
dtype: bool

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2023-02-07
    • 2017-07-31
    • 2023-01-19
    • 2019-02-24
    • 2019-07-26
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多