【问题标题】:Prevent pandas concat'ting my dataframes both vertically and horizontallyPython pandas:concat垂直和水平
【发布时间】:2018-08-22 23:29:46
【问题描述】:

我正在尝试水平连接两个数据框。 df2 包含 df1 中每个观察的 2 个结果变量。

df1.shape 
(242583, 172)
df2.shape
(242583, 2)

我的代码是:

Fin = pd.concat([df1, df2], axis= 1)

但不知何故,结果是二维堆叠的:

Fin.shape
(485166, 174)

我在这里缺少什么?

【问题讨论】:

  • 索引(行)和列索引都不同。 pandas 进行内在数据对齐。这意味着大多数在两个数据帧之间完成的所有操作都在索引上对齐。因此,您组合的数据框是行(记录)和列数中数据框的添加,因为索引没有重叠。有关示例,请参见 @jezrael 解决方案。

标签: python pandas concatenation


【解决方案1】:

有不同的索引值,所以索引不对齐,得到NaNs:

df1 = pd.DataFrame({
    'A': ['a','a','a'],
    'B': range(3)
})
print (df1)
   A  B
0  a  0
1  a  1
2  a  2

df2 = pd.DataFrame({
    'C': ['b','b','b'],
    'D': range(4,7)
}, index=[5,7,8])
print (df2)
   C  D
5  b  4
7  b  5
8  b  6

Fin = pd.concat([df1, df2], axis= 1)
print (Fin)
     A    B    C    D
0    a  0.0  NaN  NaN
1    a  1.0  NaN  NaN
2    a  2.0  NaN  NaN
5  NaN  NaN    b  4.0
7  NaN  NaN    b  5.0
8  NaN  NaN    b  6.0

一种可能的解决方案是创建默认索引:

Fin = pd.concat([df1.reset_index(drop=True), df2.reset_index(drop=True)], axis= 1)
print (Fin)
   A  B  C  D
0  a  0  b  4
1  a  1  b  5
2  a  2  b  6

或分配:

df2.index = df1.index
Fin = pd.concat([df1, df2], axis= 1)
print (Fin)
   A  B  C  D
0  a  0  b  4
1  a  1  b  5
2  a  2  b  6

df1.index = df2.index
Fin = pd.concat([df1, df2], axis= 1)
print (Fin)
   A  B  C  D
5  a  0  b  4
7  a  1  b  5
8  a  2  b  6

【讨论】:

  • 我正在写一个答案,但这打败了我!我要补充的一件事是,如果您正在努力合并数据框或系列中的数据,Pandas docs 有一个关于不同合并策略的可视化指南。
  • @Nathan - 随意将其添加到我的答案中;)
  • 我查看了视觉指南,但他们只指定了轴。我不知道索引会导致这个问题。非常感谢!
【解决方案2】:

如果您正在寻找单线,有set_index 方法:

import pandas as pd
x = pd.DataFrame({'A': ["a"] * 3, 'B': range(3)})
y = pd.DataFrame({'C': ["b"] * 3, 'D': range(4,7)})
pd.concat([x, y.set_index(x.index)], axis = 1)

请注意,pd.concat([x, y], axis = 1) 将改为创建新行并生成 NA 值,因为索引不匹配,如 @jezrael 所示

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 2011-11-08
    • 2021-11-08
    • 2013-08-12
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多