【问题标题】:Filtering a dataframe by two columns in another dataframe按另一个数据框中的两列过滤数据框
【发布时间】:2019-12-21 18:38:04
【问题描述】:

我需要一些关于熊猫问题的提示。

我有以下 DataFrame,df1,其中包含我需要保留在输出数据框中的日期名称:

name      date          column_1     column_11     
Anne      2018-01-01    some info1    some info11
John      2018-01-01    some info1    some info11
Mark      2018-02-01    some info1    some info11
Ethan     2018-03-01    some info1    some info11
Anne      2018-04-01    some info1    some info11
Ethan     2018-04-01    some info1    some info11

我有另一个 DataFrame,df2,它包含我的数据样本中的所有名称和日期:

name     date           column_2    column_22
Bob      2018-01-01     some info2   some info22
Bob      2018-01-01     some info2   some info22
Anne     2018-01-01     some info2   some info22
John     2018-01-01     some info2   some info22
Mark     2018-02-01     some info2   some info22
Mark     2018-02-01     some info2   some info22
Ethan    2018-03-01     some info2   some info22
Anne     2018-04-01     some info2   some info22
Anne     2018-04-01     some info2   some info22
Ethan    2018-04-01     some info2   some info22
Carl     2018-01-01     some info2   some info22
Joe      2018-01-01     some info2   some info22

而且,作为输出,我需要一个像 df1 这样的 DataFrame,但所有列都在 df2 中。

请注意,df1 和 df2 除了我显示的列之外还有其他列,因此它们具有不同的信息。问题是,我想要 df2 中的列,但只需要 df1 中显示的日期中的名称。

示例输出为:

name      date          column_2     column_22     
Anne      2018-01-01    some info2    some info22
John      2018-01-01    some info2    some info22
Mark      2018-02-01    some info2    some info22
Mark      2018-02-01    some info2    some info22
Ethan     2018-03-01    some info2    some info22
Anne      2018-04-01    some info2    some info22
Anne      2018-04-01    some info2    some info22    
Ethan     2018-04-01    some info2    some info22

注意:

在做:

df = df2.merge(df1)

没用

注意 2:

df1 包含来自 df2 的聚合和过滤数据,这就是为什么 df1 中的行数少于 df2 中的行数。我只想在 df2 中保留那些在 df1 中包含名称和日期的行。

这些解决方案都不起作用,所以我认为这种解释可能有助于获得正确的分析器。

【问题讨论】:

  • 你试过df = df1.merge(df2, on=['name', 'date'] , how='left')吗?
  • 这行不通。
  • 能否提供d1.dtypesd2.dtypes。我怀疑您的日期列在两个 dfs 中的存储方式不同。

标签: python pandas dataframe


【解决方案1】:

我会做以下事情:

df_out = (df1.reset_index()[["name", "date"]]
          .merge(df2.reset_index(), on=["name", "date"], how="inner"))

【讨论】:

  • 这不起作用,结果我得到一个空数据框。
  • 如果您愿意分享一个可重现的示例,我将能够为您提供帮助。列的类型有哪些?
  • name object date datetime64[ns] column_1 int64 column_11 int64 dtype: object -> for df1。对于 df2: column_22 int64 date datetime64[ns] name object column_2 object dtype: object
  • 我只是想检查我告诉你要合并的键 (["name", "date"]) 是否是相同的数据类型,实际上是。那么我向您展示的代码不应该失败。要么表格与您粘贴的表格不同,要么您在 df1 和 df2 之间没有任何重合
【解决方案2】:

我将使用中级DataFrames 逐步执行此操作。这效率较低,但可以让您更深入地了解正在发生的事情。

只取df1的姓名和日期

df_key = df1.loc[:, ["name", "date"]] 

使用键表和df2inner join(在this article 中称为自然连接),这将只生成名称和日期匹配的记录

df_out_1 = df_2.merge(
        df_key, 
        how="inner", 
        left_on=["name", "date"], 
        right_on=["name", "date"]
] 

从生成的连接中挑选出你想要的列,然后你就完成了

df_out_2 = df_out_1.loc[:, ["name", "date", "column_2", "column_22"]]

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 2018-03-08
    • 2021-09-09
    • 2020-11-16
    • 2016-10-02
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多