我试图从彼此完全不同的两个数据帧创建一个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
答案 0 :(得分:3)
定位您的需求。
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=1
和DataFrame.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)
代码像这样拆分:
我个人将其分为几个步骤:
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)