【问题标题】:Concat/join/merge multiple dataframes based on row index (number) of each individual dataframes根据每个单独数据帧的行索引(数量)连接/加入/合并多个数据帧
【发布时间】:2019-03-07 16:04:44
【问题描述】:

我想读取数据帧列表的每一行,并通过附加所有第 N 行来创建一个新的数据帧。

假设我们有以下 DataFrame:

>>> df1
   A    B    C    D
0 -0.8 -2.8 -0.3 -0.1
1 -0.1 -0.9  0.2 -0.7
2  0.7 -3.3 -1.1 -0.4 

>>> df2
   A    B    C    D
0  1.4 -0.7  1.5 -1.3
1  1.6  1.4  1.4  0.2
2 -1.4  0.2 -1.7  0.7 

>>> df3
   A    B    C    D
0  0.3 -0.5 -1.6 -0.8
1  0.2 -0.5 -1.1  1.6
2 -0.3  0.7 -1.0  1.0

我使用以下方法来获得所需的df:

df = pd.DataFrame()

df_list = [df1, df2, df3]

for i in range(len(df1)):
    for x in df_list:
        df = df.append(x.loc[i], ignore_index = True)

结果如下:

>>> df
   A    B    C    D
0 -0.8 -2.8 -0.3 -0.1
1  1.4 -0.7  1.5 -1.3
2  0.3 -0.5 -1.6 -0.8
3 -0.1 -0.9  0.2 -0.7
4  1.6  1.4  1.4  0.2
5  0.2 -0.5 -1.1  1.6
6  0.7 -3.3 -1.1 -0.4
7 -1.4  0.2 -1.7  0.7
8 -0.3  0.7 -1.0  1.0 

我只是想知道是否有一种 pandas 的方式来重写这段代码,它会做同样的事情(可能通过使用 .iterrows、pd.concat、pd.join 或 pd.merge)?

干杯

更新 简单地一个接一个地附加一个 df 不是我在这里寻找的。​​p>

代码应该做的:

df.row1 = df1.row1
df.row2 = df2.row1
df.row3 = df3.row1
df.row4 = df1.row2
df.row5 = df2.row2
df.row6 = df3.row2
...

【问题讨论】:

  • 可能duplicate,那里已经有答案了。
  • 注意结果中的行顺序
  • 应该避免在得到答案后编辑代码,因为到时候已经提供了答案,而花在这上面的时间是徒劳的,如果你有版本打开一个新问题!我看到 13 小时前提出的问题,顶部有新版本。
  • @pygo 代码根本没有改变。有很多不相关的答案,所以我想我需要让其他人仔细阅读问题,然后添加回复。标题和代码都没有改变。干杯

标签: python pandas join merge append


【解决方案1】:

对于单个输出数据帧,您可以按索引连接和排序:

res = pd.concat([df1, df2, df3]).sort_index().reset_index(drop=True)

     A    B    C    D
0 -0.8 -2.8 -0.3 -0.1
1  1.4 -0.7  1.5 -1.3
2  0.3 -0.5 -1.6 -0.8
3 -0.1 -0.9  0.2 -0.7
4  1.6  1.4  1.4  0.2
5  0.2 -0.5 -1.1  1.6
6  0.7 -3.3 -1.1 -0.4
7 -1.4  0.2 -1.7  0.7
8 -0.3  0.7 -1.0  1.0

对于数据框的字典,您可以连接然后按索引分组:

res = dict(tuple(pd.concat([df1, df2, df3]).groupby(level=0)))

使用如上定义的字典,每个值代表一个行号。例如,res[0] 将给出每个输入数据帧的第一行。

【讨论】:

  • 太棒了!这正是我想要的。
【解决方案2】:

试试:

>>> df1 = pd.DataFrame({'A':['-0.8', '-0.1', '0.7'],
...                     'B':['-2.8', '-0.9', '-3.3'],
...                      'C':['-0.3', '0.2', '-1.1'],
...                      'D':['-0.1', '-0.7', '-0.4']})
>>>
>>> df2 = pd.DataFrame({'A':['1.4', '1.6', '-1.4'],
...                     'B':['-0.7', '1.4', '0.2'],
...                      'C':['1.5', '1.4', '-1.7'],
...                      'D':['-1.3', '0.2', '0.7']})
>>>

>>> df3 = pd.DataFrame({'A':['0.3', '0.2', '-0.3'],
...                     'B':['-0.5', '-0.5', '0.7'],
...                      'C':['-1.6', '-1.1', '-1.0'],
...                      'D':['-0.8', '1.6', '1.0']})

>>> df=pd.concat([df1,df2,df3],ignore_index=True)
>>> print(df)
      A     B     C     D
0  -0.8  -2.8  -0.3  -0.1
1  -0.1  -0.9   0.2  -0.7
2   0.7  -3.3  -1.1  -0.4
3   1.4  -0.7   1.5  -1.3
4   1.6   1.4   1.4   0.2
5  -1.4   0.2  -1.7   0.7
6   0.3  -0.5  -1.6  -0.8
7   0.2  -0.5  -1.1   1.6
8  -0.3   0.7  -1.0   1.0

df=pd.concat([df1,df2,df3], axis=0, join='outer', ignore_index=True)

注意:

axis: whether we will concatenate along rows (0) or columns (1)
join: can be set to inner, outer, left, or right. by using outer its sort it's lexicographically
ignore_index: whether or not the original row labels from should be retained, by default False ,If True, do not use the index labels.

【讨论】:

  • 这个和我的有什么不同
  • @Wen,我看到它没有区别,只是我在复制 OPS 场景来测试和回答,所以应该没有冒犯?有什么问题吗。
  • 这不是代码所期望的。您的方法不会产生预期结果
  • @Manny,请找出更适合您的答案!或者到现在为止,您可能已经得到了获得预期结果的提示,因为有足够的答案可以提供最好的理解。
【解决方案3】:

您可以通过这种方式将它们连接起来,将它们的原始索引保留为一列:

df_total = pd.concat([df1.reset_index(), df2.reset_index(),
                      df3.reset_index()]) 

>> df_total
   index    A    B    C    D
0      0 -0.8 -2.8 -0.3 -0.1
1      1 -0.1 -0.9  0.2 -0.7
2      2  0.7 -3.3 -1.1 -0.4
0      0  1.4 -0.7  1.5 -1.3
1      1  1.6  1.4  1.4  0.2
2      2 -1.4  0.2 -1.7  0.7
0      0  0.3 -0.5 -1.6 -0.8
1      1  0.2 -0.5 -1.1  1.6
2      2 -0.3  0.7 -1.0  1.0

然后你可以制作一个多索引数据框并按索引排序:

df_joined = df_total.reset_index(drop=True).reset_index()

>> df_joined
   level_0  index    A    B    C    D
0        0      0 -0.8 -2.8 -0.3 -0.1
1        1      1 -0.1 -0.9  0.2 -0.7
2        2      2  0.7 -3.3 -1.1 -0.4
3        3      0  1.4 -0.7  1.5 -1.3
4        4      1  1.6  1.4  1.4  0.2
5        5      2 -1.4  0.2 -1.7  0.7
6        6      0  0.3 -0.5 -1.6 -0.8
7        7      1  0.2 -0.5 -1.1  1.6
8        8      2 -0.3  0.7 -1.0  1.0

>> df_joined = df_joined.set_index(['index', 'level_0']).sort_index()

>> df_joined

                 A    B    C    D
index level_0                    
0     0       -0.8 -2.8 -0.3 -0.1
      3        1.4 -0.7  1.5 -1.3
      6        0.3 -0.5 -1.6 -0.8
1     1       -0.1 -0.9  0.2 -0.7
      4        1.6  1.4  1.4  0.2
      7        0.2 -0.5 -1.1  1.6
2     2        0.7 -3.3 -1.1 -0.4
      5       -1.4  0.2 -1.7  0.7
      8       -0.3  0.7 -1.0  1.0

您可以通过以下方式将所有这些都放入数据框:

>>  pd.DataFrame(df_joined.values, columns = df_joined.columns)

     A    B    C    D
0 -0.8 -2.8 -0.3 -0.1
1  1.4 -0.7  1.5 -1.3
2  0.3 -0.5 -1.6 -0.8
3 -0.1 -0.9  0.2 -0.7
4  1.6  1.4  1.4  0.2
5  0.2 -0.5 -1.1  1.6
6  0.7 -3.3 -1.1 -0.4
7 -1.4  0.2 -1.7  0.7
8 -0.3  0.7 -1.0  1.0

【讨论】:

    【解决方案4】:

    pd.concat

    df=pd.concat([df1,df2,df3]).reset_index(drop=True)
    

    杰兹推荐

    df=pd.concat([df1,df2,df3],ignore_index=True)
    

    【讨论】:

    • ignore_index=True ?
    • 这里的问题不是一个接一个地追加DataFrame,而是先取所有第一行,然后取第二行,再取第三行,以此类推……
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2017-09-04
    相关资源
    最近更新 更多