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_id
,DataFrame.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')跨度> 哦,好吧...这是因为两个表都有名为state
和timezone
的列。您将需要指定一个后缀,以便它们在生成的 DataFrame 中成为类似于 state_suffix_left
和 state_suffix_right
的内容。检查join
方法的文档,参数lsuffix
和rsuffix
。
设置df1
和df2
的索引后,尝试调用df1.join(df2, how='outer', lsuffix='_left', rsuffix='_right')
。我相信它会起作用。以上是关于Python Pandas - 连接两个具有不同行数和列数的数据框的主要内容,如果未能解决你的问题,请参考以下文章