Python Pandas - 连接两个具有不同行数和列数的数据框

Posted

技术标签:

【中文标题】Python Pandas - 连接两个具有不同行数和列数的数据框【英文标题】:Python Pandas - Concat two data frames with different number of rows and columns 【发布时间】:2019-10-29 16:37:54 【问题描述】:

我有两个具有不同行号和列的数据框。这两个表都有一些常见的列,包括“客户 ID”。两张表的大小分别为 11697 行 × 15 列和 385839 行 × 6 列。客户 ID 可能在第二个表中重复。我想连接两个表,并想使用客户 ID 合并相似的列。我怎么能用 python PANDAS 做到这一点。 一张桌子是这样的——

另一个看起来像这样 -

我正在使用下面的代码 -

 pd.concat([df1, df2], sort=False)

只是想确保我不会丢失任何信息?如何检查是否有多个条目具有一个 ID,以及如何将其组合到一个结果中?

编辑 -

当我使用上面的代码时,这里是数据集中 NA 的值之前和之后 -

谁能告诉我哪里出错了?

【问题讨论】:

阅读pd.concat的文档 concat 主要用于将一个数据帧堆叠在另一个数据帧之上 【参考方案1】:

pd.concat 将在这里解决问题,只需将轴设置为 1 以在第二个轴(列)上连接,您应该首先将两个数据帧的索引设置为 customer_id

import pandas as pd
pd.concat([df1.set_index('customer_id'), df2.set_index('customer_id')], axis = 1)

如果您想在连接后省略空值的行,请使用 dropna:

pd.concat([df1.set_index('customer_id'), df2.set_index('customer_id')], axis = 1).dropna()

【讨论】:

这个解决方案为我提供了大部分数据的 NA 值(39000 行中的 38000 行。如果我放弃 NA,我得到 0 行。 concat 将为任何缺失值返回 nan 值,您的客户 ID 对于两个数据框是否相同? 我不确定客户 ID,因为在一个帧中我有 11000 个 ID,而在另一个数据帧中我有 39000 个 ID(观察) 那么,id不同的情况下如何合并列 对此很抱歉,我刚刚检查过了。所有 id 在两个数据框中都是唯一的。【参考方案2】:

我相信DataFrame.merge 在这种情况下会起作用:

# use how='outer' to preserve all information from both DataFrames
df1.merge(df2, how='outer', on='customer_id')

如果两个 DataFrame 的索引都设置为 customer_idDataFrame.join 也可以工作(这也更简单):

df1 = df1.set_index('customer_id')
df2 = df2.set_index('customer_id')
df1.join(df2, how='outer')
Documentation for DataFrame.merge Documentation for DataFrame.join

【讨论】:

第二个代码建议 - 此代码给了我一个错误 - ValueError: 列重叠但未指定后缀:Index([u'state', u'timezone'], dtype='object')跨度> 哦,好吧...这是因为两个表都有名为statetimezone 的列。您将需要指定一个后缀,以便它们在生成的 DataFrame 中成为类似于 state_suffix_leftstate_suffix_right 的内容。检查join方法的文档,参数lsuffixrsuffix 设置df1df2的索引后,尝试调用df1.join(df2, how='outer', lsuffix='_left', rsuffix='_right')。我相信它会起作用。

以上是关于Python Pandas - 连接两个具有不同行数和列数的数据框的主要内容,如果未能解决你的问题,请参考以下文章

Python更新具有相同列和一些不同行的两个数据框

使用 Python Pandas 连接两个具有范围条件的表

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python

只外连接 python pandas

HIVE JOIN 两个具有不同行数的表给出错误的列值

我需要从 pandas DataFrame 对象中创建一个 python 列表对象或任何对象,对来自不同行的值进行分组