我需要一些有关熊猫问题的提示。
我有以下数据框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中名称和日期的行。
所有解决方案均无效,所以我认为也许这种解释将有助于获得正确的答案。
答案 0 :(得分:0)
我将执行以下操作:
df_out = (df1.reset_index()[["name", "date"]]
.merge(df2.reset_index(), on=["name", "date"], how="inner"))
答案 1 :(得分:0)
我将与中间DataFrames
分步进行。这虽然效率较低,但可以让您更深入地了解正在发生的事情。
仅使用df1
中的名称和日期:
df_key = df1.loc[:, ["name", "date"]]
使用键表和df2
的{{3}}(在inner join中称为自然联接),将仅生成名称和日期匹配的记录:
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"]]