使用熊猫,从长格式df提取数据并将其添加到宽格式df

问题描述 投票:0回答:1

我有两个数据帧df1和df2。 df1具有以宽格式排列的重复观测,而df2具有长格式。

import pandas as pd
df1 = pd.DataFrame({"ID":[1,2,3],"colA_1":[1,2,3],"date1":["1.1.2001", "2.1.2001","3.1.2001"],"colA_2":[4,5,6],"date2":["1.1.2002", "2.1.2002","3.1.2002"]})
df2 = pd.DataFrame({"ID":[1,1,2,2,3,3],"col1":[1,1.5,2,2.5,3,3.5],"date":["1.1.2001", "1.1.2002","2.1.2001","2.1.2002","3.1.2001","3.1.2002"], "col3":[11,12,13,14,15,16],"col4":[21,22,23,24,25,26]})

df1看起来像:

   ID  colA_1     date1  colA_2     date2
0   1       1  1.1.2001       4  1.1.2002
1   2       2  2.1.2001       5  2.1.2002
2   3       3  3.1.2001       6  3.1.2002

df2看起来像:

   ID  col1     date1  col3  col4
0   1   1.0  1.1.2001    11    21
1   1   1.5  1.1.2002    12    22
2   2   2.0  2.1.2001    13    23
3   2   2.5  2.1.2002    14    24
4   3   3.0  3.1.2001    15    25
5   3   3.5  3.1.2002    16    26
6   3   4.0  4.1.2002    17    27


我想从df2中获取给定的列,“ col3”,然后:

((1)如果df2中的列“ ID”和“ date”与df1中的列“ ID”和“ date1”匹配,我想将该值放在df1中名为“ colB_1”的新列中。

((2)否则,如果df2中的“ ID”和“ date”列与df1中的“ ID”和“ date2”列匹配,我想将该值放在df1中名为“ colB_2”的新列中。 >

((3)否则,如果df2中的列“ ID”和“ date”与(“ ID”和“ date1”)或(“ ID”和“ date2”)不匹配,我想忽略这些行。

因此,此输出数据帧df3的输出应如下所示:

   ID  colA_1     date1  colA_2     date2  colB_1  colB_2
0   1       1  1.1.2001       4  1.1.2002      11      12
1   2       2  2.1.2001       5  2.1.2002      13      14
2   3       3  3.1.2001       6  3.1.2002      15      16

最佳方法是什么?

我找到了this链接,但答案对我的情况不起作用。我想要一种真正明确的方式来指定列匹配。我认为df.mask可能可以帮助我,但我不确定如何实现。

例如:以下代码

df3 = df1.copy()
df3["colB_1"] = ""
df3["colB_2"] = ""
filter1 = (df1["ID"] == df2["ID"]) & (df1["date1"] == df2["date"])
filter2 = (df1["ID"] == df2["ID"]) & (df1["date2"] == df2["date"])
df3["colB_1"] = df.mask(filter1, other=df2["col3"])
df3["colB_2"] = df.mask(filter2, other=df2["col3"])

给出错误

ValueError: Can only compare identically-labeled Series objects

我问了这个问题previously,它被标记为已关闭;我的问题被标记为this的重复。然而,这种情况并非如此。链接的问题中的答案建议使用map或df.merge。地图不适用于多种条件(在我的情况下是ID和日期)。当要合并的df1和df2中的列名称之一不同(例如,“ date”和“ date1”)时,df.merge(为匹配多个列而给出的答案)不起作用。 >

例如,以下代码:

df3 = df1.merge(df2[["ID","date","col3"]], on=['ID','date1'], how='left')

因键错误而失败。

同样值得注意的是,我将使用许多不同的列命名方案来处理许多不同的文件,并且每次都需要一个不同的子集。这就是为什么我想要一个明确命名列和条件的答案的原因。

对此的任何帮助将不胜感激。

我有两个数据帧df1和df2。 df1具有以宽格式排列的重复观测值,而df2具有长格式。以pd df1 = pd.DataFrame({“ ID”:[1,2,3],“ colA_1”:[1,2,3],“ date1”:[“ 1.1 ....

python pandas dataframe
1个回答
0
投票

替换下划线后可以使用pd.wide_to_long,这将取消数据框的旋转,您可以使用该数据框与pd.wide_to_long合并,然后使用df2合并为pivot

unstack
© www.soinside.com 2019 - 2024. All rights reserved.