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

pandas三向连接列上的多个数据帧

万高畅
2023-03-14

我有3个CSV文件。每个数据框都有第一列作为人的(字符串)名称,而每个数据框中的所有其他列都是该人的属性。

如何将所有三个CSV文档“连接”在一起,创建一个单个CSV,每行都具有该人字符串名称的每个唯一值的所有属性?

Pandas中的连接()函数指定我需要一个多索引,但是我对分层索引方案与基于单个索引进行连接有什么关系感到困惑。

共有3个答案

巫经义
2023-03-14

join方法正是针对这些类型的情况构建的。您可以将任意数量的数据帧与它连接在一起。调用的数据帧与传递的数据帧集合的索引联接。要使用多个数据帧,必须将连接列放入索引中。

代码看起来像这样:

filenames = ['fn1', 'fn2', 'fn3', 'fn4',....]
dfs = [pd.read_csv(filename, index_col=index_col) for filename in filenames)]
dfs[0].join(dfs[1:])

使用@零的数据,您可以这样做:

df1 = pd.DataFrame(np.array([
    ['a', 5, 9],
    ['b', 4, 61],
    ['c', 24, 9]]),
    columns=['name', 'attr11', 'attr12'])
df2 = pd.DataFrame(np.array([
    ['a', 5, 19],
    ['b', 14, 16],
    ['c', 4, 9]]),
    columns=['name', 'attr21', 'attr22'])
df3 = pd.DataFrame(np.array([
    ['a', 15, 49],
    ['b', 4, 36],
    ['c', 14, 9]]),
    columns=['name', 'attr31', 'attr32'])

dfs = [df1, df2, df3]
dfs = [df.set_index('name') for df in dfs]
dfs[0].join(dfs[1:])

     attr11 attr12 attr21 attr22 attr31 attr32
name                                          
a         5      9      5     19     15     49
b         4     61     14     16      4     36
c        24      9      4      9     14      9
秦昂然
2023-03-14

如果您有3个数据帧,可以尝试此方法

# Merge multiple dataframes
df1 = pd.DataFrame(np.array([
    ['a', 5, 9],
    ['b', 4, 61],
    ['c', 24, 9]]),
    columns=['name', 'attr11', 'attr12'])
df2 = pd.DataFrame(np.array([
    ['a', 5, 19],
    ['b', 14, 16],
    ['c', 4, 9]]),
    columns=['name', 'attr21', 'attr22'])
df3 = pd.DataFrame(np.array([
    ['a', 15, 49],
    ['b', 4, 36],
    ['c', 14, 9]]),
    columns=['name', 'attr31', 'attr32'])

pd.merge(pd.merge(df1,df2,on='name'),df3,on='name')

或者如Cwharland所说

df1.merge(df2,on='name').merge(df3,on='name')
凌声
2023-03-14

假定进口:

import pandas as pd

John Galt的答案基本上是一个reduce操作。如果我有多个数据帧,我会将它们放在这样的列表中(通过列表理解或循环或诸如此类的方式生成):

dfs = [df0, df1, df2, dfN]

假设它们有一些公共列,比如您的示例中的name,我会执行以下操作:

df_final = reduce(lambda left,right: pd.merge(left,right,on='name'), dfs)

这样,您的代码就可以处理任意数量的要合并的数据帧。

编辑:2016年8月1日:对于使用Python 3的用户:reduce已移至functools。因此,要使用此函数,首先需要导入该模块:

from functools import reduce
 类似资料:
  • 问题内容: 我有3个CSV文件。每个人都有第一列作为人物的(字符串)名称,而每个数据框中的所有其他列都是该人物的属性。 如何将所有三个CSV文档“连接”在一起以创建单个CSV,并且每一行都具有该人的字符串名称的每个唯一值的所有属性? 中的函数指定我需要一个多索引,但是我对层次化索引方案与基于单个索引进行联接有何关系感到困惑。 问题答案: 假设进口: John Galt的答案基本上是一项手术。如果我

  • 问题内容: 我是使用DataFrame的新手,我想知道如何在一系列表的多个列上执行等效于左外部联接的SQL 例: 本质上,我想做类似以下SQL代码的操作(注意df3在Year上没有加入): 结果应如下所示: 我曾尝试使用合并和联接,但无法弄清楚如何在多个表上以及涉及多个联接时执行此操作。有人可以帮我吗? 谢谢 问题答案: 合并他们在两个步骤,和第一,然后那到结果。 我从df3删除了year,因为您

  • 问题内容: 我有2个数据框: restaurant_ids_dataframe 和 restaurant_review_frame 我想使用熊猫中的DataFrame.join()命令将这两个DataFrame加入一个单一的数据框中。 我尝试了以下代码行: 但是,当我尝试这样做时,出现以下错误: 我对熊猫很陌生,不知道就执行join语句而言我在做什么错。 任何帮助将非常感激。 问题答案: 您可以使

  • 有没有一种方法可以将下面的两个数据流连接起来,这样: 我将有一个带有标题的新数据帧: 时间戳调整的关闭reportedEPS estimatedEPS 并且reportedEPS和estimatedEPS将根据以下值保持不变: 时间戳:1月1日至3月31日,4月1日至6月30日,7月1日至9月30日,10月1日至12月31日? 2个数据流: https://gyazo.com/38B50A3D7E

  • 问题内容: 我有多个pandas数据框,它们的列数可能不同,这些列的数量通常在50到100之间。我需要创建一个最终列,该列只是所有列的连接。基本上,该列第一行中的字符串应该是所有列第一行中的字符串的总和(并置)。我在下面编写了循环,但我觉得可能有更好的更有效的方法来执行此操作。有关如何执行此操作的任何想法 问题答案: 解决方案,但输出是,因此必须转换为和: 另一个具有function的解决方案,但

  • 我有两个dataframes(df1和df2,如下所示),它们的列在顺序和计数上都不同。我需要将这两个数据页追加到一个Excel文件中,其中的列顺序必须按照下面中指定的顺序。 df1为: 我正在尝试使用根据Col_list重新排序我的dataframe。对于dataframe中不存在的列值,该值可以是NaN。 这不能正常工作。如何实现此重新排序? 我尝试了以下方法: