当前位置: 首页 > 知识库问答 >
问题:

合并两个数据帧而不复制项

郜谦
2023-03-14

我有两个数据帧

left = pd.DataFrame(
    {"K": ["K0", "K0", "K1", "K2"], "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"]}
)

right = pd.DataFrame(
    {"K": ["K0", "K0", "K0", "K2"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"]}
)

    K   A   B
0  K0  A0  B0
1  K0  A1  B1
2  K1  A2  B2
3  K2  A3  B3

    K   C   D
0  K0  C0  D0
1  K0  C1  D1
2  K0  C2  D2
3  K2  C3  D3

我希望将它们合并到一个数据帧中,以便在两个数据帧中都存在键的情况下只考虑行:

   K   A   B   C   D
0  K0  A0  B0  C0  D0
1  K0  A1  B1  C1  D1
2  K2  A2  B2  C3  D3

如果我使用pandas.merge,我总是得到重复的行。有没有一个简单的方法来实现这一点?

共有2个答案

刘令
2023-03-14

使用pd.concat

data1="""Index  K   A   B
0  K0  A0  B0
1  K0  A1  B1
2  K1  A2  B2
3  K2  A3  B3"""

data2="""K   C   D
0  K0  C0  D0
1  K0  C1  D1
2  K0  C2  D2
3  K2  C3  D3"""

data1 = pd.read_table(StringIO(data1), sep='\s+')
data1 = data1.rename(columns={'K':'K1'})

data2 = pd.read_table(StringIO(data2), sep='\s+')
data2 = data2.rename(columns={'K':'K2'})
data  = pd.concat([data1, data2], axis=1)


#print(data1,data2)
data = data.drop(data[data.K1 != data.K2].index, axis=0)
data.drop('K2',axis=1,inplace=True)
print(data)

输出

   Index  K1   A   B   C   D
0      0  K0  A0  B0  C0  D0
1      1  K0  A1  B1  C1  D1
3      3  K2  A3  B3  C3  D3
羊舌成周
2023-03-14

枚举键,然后合并键和枚举:

(left.assign(enum=left.groupby('K').cumcount())
     .merge(right.assign(enum=right.groupby('K').cumcount()),
            on=['K', 'enum'])
     .drop('enum', axis=1)
)

输出:

    K   A   B   C   D
0  K0  A0  B0  C0  D0
1  K0  A1  B1  C1  D1
2  K2  A3  B3  C3  D3
 类似资料:
  • 我有两个数据帧,DF1和DF2,DF1是存储来自DF2的任何附加信息的主机。 假设DF1是以下格式, DF2包含DF1中已经存在的2个条目和两个新条目。(itemId和item被视为一个组,可以被视为连接的键) 我需要合并两个数据框,以便增加现有项目计数并插入新项目。 结果应该是这样的: 我有一种方法可以做到这一点,但不确定这种方法是否有效或正确

  • 我正在尝试连接到数据帧。它们看起来像这样 期望的最终目标是: 我一直试图使用pd.merge和。连接函数与on='外'设置不成功

  • 我有两个数据帧DF1和DF2。 DF1: DF2: 我需要来自DF2的行数,其中EmploymentType='Employee',EmpStatus='Active',EmpStartDate 输出: 如何在不合并两个数据帧的情况下实现这一点? 我不能合并数据帧,因为没有公共键,而且因为我需要基于条件的行数,我不能在任何临时列上加入数据帧,因为我需要避免交叉连接。

  • 我肯定错过了一些简单的东西。尝试合并熊猫中的两个数据帧,它们的列名基本相同,但右边的数据帧有一些左边没有的列,反之亦然。 我已尝试使用外部联接进行联接: 但这会产生: 我还指定了一个要连接的列(例如,on="id"),但这会重复所有列,除了"id",如attr_1_x、attr_1_y,这并不理想。我还传递了整个列列表(有很多)到on: 其产生: 我错过了什么?我想得到一个附加了所有行的df,并且

  • 我有一个包含18个数据帧的列表: 所有数据帧都有一个公共id列,因此很容易将它们与pd连接在一起。一次合并2个。有没有一种方法可以一次将它们连接起来,从而使dfList作为单个数据帧返回?