熊猫-堆叠具有不同名称和列数的数据框

时间:2020-07-28 09:46:46

标签: python-3.x pandas dataframe

我试图从彼此完全不同的两个数据帧创建一个csv日志,所以我不能只是简单地进行合并/合并。第一个数据帧只是一列数据点,其列比第二个数据帧多,而第二个数据帧则有一堆数据点。我还想在它们之间添加一个空白行以增加清晰度。有没有办法将它们组合在一起,使第二个数据帧的空白单元格获得NaN值?

考虑以下简化示例:

数据框1:

    Col A  Col B  Col C  Col D  Col E
0    XYZ    452   GHJ    089     IUT   

数据框2:

    Data1  Data2  Data3  Data4
0   1234   4567   7890   6543      
1   8765   4565   8767   0987
..
n   4387   0943   4598   3212

输出:

    Col A  Col B  Col C  Col D  Col E
0    XYZ    452   GHJ    089     IUT     
1    NaN    NaN   NaN    NaN     NaN
2    1234   4567  7890   6543    NaN
3    8765   4565  8767   0987    NaN
..
n    4387   0943  4598   3212    NaN

4 个答案:

答案 0 :(得分:3)

定位您的需求。

  1. 将第二个数据框的列与第一个数据列的宽度相乘,以免宽度过大
  2. 然后concat()插入一个新的数据帧,在它们之间是第一个数据帧中第一列的伪np.nan
import numpy as np
df1 = pd.DataFrame({"Col A":["XYZ"],"Col B":[452],"Col C":[" GHJ"],"Col D":[89],"Col E":[" IUT"]})
df2 = pd.DataFrame({"Data1":[1234,8765,4387],"Data2":[4567,4565,943],"Data3":[7890,8767,4598],"Data4":[6543,987,3212]})
df2.columns=[df1.columns[i] for i,c in enumerate(df2.columns) if i<len(df1.columns)]

pd.concat([
    df1,
    pd.DataFrame({df1.columns[0]:[np.nan]}),
    df2
])

输出

Col A   Col B Col C   Col D Col E
  XYZ   452.0   GHJ    89.0   IUT
  NaN     NaN   NaN     NaN   NaN
 1234  4567.0  7890  6543.0   NaN
 8765  4565.0  8767   987.0   NaN
 4387   943.0  4598  3212.0   NaN

答案 1 :(得分:3)

使用axis=1DataFrame.set_axis使df2的列与df1的列一致,然后将pd.concat与可选参数ignore_index=True一起使用将其与数据框df1相连:

df = pd.concat([df1.append(pd.Series(), ignore_index=True),
                df2.set_axis(df1.columns[:df2.shape[1]], axis=1)], ignore_index=True)

结果:

print(df)
  Col A   Col B Col C   Col D Col E
0   XYZ   452.0   GHJ    89.0   IUT
1   NaN     NaN   NaN     NaN   NaN
2  1234  4567.0  7890  6543.0   NaN
3  8765  4565.0  8767   987.0   NaN
4  4387   943.0  4598  3212.0   NaN

答案 2 :(得分:2)

您可以尝试以下方法:

m = df1.iloc[:,:df2.shape[1]].append(pd.Series(), ignore_index=True)
out = pd.DataFrame(np.vstack((m,df2)),columns=m.columns).join(df1.iloc[:,df2.shape[1]:])

print(out)

  Col A Col B Col C Col D Col E
0   XYZ   452   GHJ    89   IUT
1   NaN   NaN   NaN   NaN   NaN
2  1234  4567  7890  6543   NaN
3  8765  4565  8767   987   NaN
......
......

采取的方法:

  • 根据第二个数据帧的shape[1]对第一个数据帧进行切片,并添加一个空行
  • 使用np.vstack创建一个堆叠数组并调用数据框构造函数
  • 将列名称作为第一个切片,因为我们希望从第一个数据帧中获取列名称
  • 将其余的列连接到数据框。

答案 3 :(得分:1)

如果您真的想在一行中做到这一点:

df = pd.concat([df1.rename({x: i for i, x in enumerate(df1.columns)}, axis=1), df2.rename({x: i for i, x in enumerate(df2.columns)}, axis=1)]).rename({i: x for i, x in enumerate(df1.columns)}, axis=1)

代码像这样拆分:

  • 将两个数据框的列重命名为0-> len(columns)
  • 连接数据框
  • 将列重命名为第一个数据框的列

我个人将其分为几个步骤:

df1_renamed = df1.rename({x: i for i, x in enumerate(df1.columns)}, axis=1)
df2_renamed = df2.rename({x: i for i, x in enumerate(df2.columns)}, axis=1)
df = pd.concat([df1_renamed, df2_renamed])
df.rename({i: x for i, x in enumerate(df1.columns)}, axis=1, inplace=True)