我有多个函数,可以生成不同长度的多个数据帧,我的目标是将它们合并到一个地方,然后将其导出并导出到Excel,下面是三个函数的三个不同输出数据帧的示例.

import pandas as pd

data1 = {'Header':['L1','L2','L3'], 'Val1':[float(100),float(200),float(300)],
         'Val2':[float(400),float(500),float(600)], 'Val3': 
         [float(700),float(800),float(900)]}
data1_summary = pd.DataFrame(data=data1)

# Inside loop it'll create two more such outputs but with different values but with the same labels.

data2 = {'Header':['L5','L6'], 'Val5':[float(1000),float(1100)],
         'Val6':[float(1300),float(1400)]}
data2_summary = pd.DataFrame(data=data2)

data3 = {'Header':['L7','L8','L9','L10'], 'Val7':[float(1900),float(2000),float(2100),float(2200)],
         'Val8':[float(2900),float(2300),float(2400),float(2800)], 'Val9': 
         [float(3500),float(3600),float(3700),float(3900)]}
data3_summary = pd.DataFrame(data=data3)

在所有三个输出中有不同的"标题",类似地,有不同的标签"Val1"到"Val9",并且针对它们中的每一个都有对应的值,如果我们在工作表中输出所有内容(即,data1_summary,data2_summary,data3_summary)它就像一个网格,稍后我们可以对该数据执行pivot.

预期yields 如下.

Val1 Val2 Val3 Val5 Val6 Val7 Val8 Val9
L1 100 400 700 0 0 0 0 0
L2 200 500 800 0 0 0 0 0
L3 300 600 900 0 0 0 0 0
L5 0 0 0 1000 1300 0 0 0
L6 0 0 0 1100 1400 0 0 0
L7 0 0 0 0 0 1900 2900 3500
L8 0 0 0 0 0 2000 2300 3600
L9 0 0 0 0 0 2100 2400 3700
L10 0 0 0 0 0 2200 2800 3900

推荐答案

如果需要删除Header列,然后创建默认列名,请使用:

dfs = [data1_summary,data2_summary,data3_summary]
df = pd.concat(x.drop('Header', axis=1)
               set_axis(range(len(x.columns)-1), axis=1) for x in dfs)

print (df)
        0       1       2
0   100.0   400.0   700.0
1   200.0   500.0   800.0
2   300.0   600.0   900.0
0  1000.0  1300.0     NaN
1  1100.0  1400.0     NaN
0  1900.0  2900.0  3500.0
1  2000.0  2300.0  3600.0
2  2100.0  2400.0  3700.0
3  2200.0  2800.0  3900.0

或者,如果只需要创建默认列名,请使用:

dfs = [data1_summary,data2_summary,data3_summary]
df = pd.concat(x.set_axis(range(len(x.columns)), axis=1) for x in dfs)

print (df)
     0       1       2       3
0   L1   100.0   400.0   700.0
1   L2   200.0   500.0   800.0
2   L3   300.0   600.0   900.0
0   L5  1000.0  1300.0     NaN
1   L6  1100.0  1400.0     NaN
0   L7  1900.0  2900.0  3500.0
1   L8  2000.0  2300.0  3600.0
2   L9  2100.0  2400.0  3700.0
3  L10  2200.0  2800.0  3900.0

编辑:你可以在concatDataFrame.rename_axisDataFrame.fillna中使用列表解析:

dfs = [data1_summary, data2_summary, data3_summary]

df = (pd.concat((x.set_index('Header') for x in dfs), axis=1)
        .rename_axis(None)
        .fillna(0, downcast='int'))

print (df)
     Val1  Val2  Val3  Val5  Val6  Val7  Val8  Val9
L1    100   400   700     0     0     0     0     0
L2    200   500   800     0     0     0     0     0
L3    300   600   900     0     0     0     0     0
L5      0     0     0  1000  1300     0     0     0
L6      0     0     0  1100  1400     0     0     0
L7      0     0     0     0     0  1900  2900  3500
L8      0     0     0     0     0  2000  2300  3600
L9      0     0     0     0     0  2100  2400  3700
L10     0     0     0     0     0  2200  2800  3900

如果可能,Header秒内复制可能每Header秒聚合sum个:

dfs = [data1_summary, data2_summary, data3_summary]

df = (pd.concat((x.set_index('Header') for x in dfs), axis=1)
        .groupby('Header', sort=False)
        .sum()
        .reset_index())

print (df)
  Header   Val1   Val2   Val3    Val5    Val6    Val7    Val8    Val9
0     L1  100.0  400.0  700.0     0.0     0.0     0.0     0.0     0.0
1     L2  200.0  500.0  800.0     0.0     0.0     0.0     0.0     0.0
2     L3  300.0  600.0  900.0     0.0     0.0     0.0     0.0     0.0
3     L5    0.0    0.0    0.0  1000.0  1300.0     0.0     0.0     0.0
4     L6    0.0    0.0    0.0  1100.0  1400.0     0.0     0.0     0.0
5     L7    0.0    0.0    0.0     0.0     0.0  1900.0  2900.0  3500.0
6     L8    0.0    0.0    0.0     0.0     0.0  2000.0  2300.0  3600.0
7     L9    0.0    0.0    0.0     0.0     0.0  2100.0  2400.0  3700.0
8    L10    0.0    0.0    0.0     0.0     0.0  2200.0  2800.0  3900.0

Python相关问答推荐

为什么tkinter框架没有被隐藏?

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

. str.替换pandas.series的方法未按预期工作

Python库:可选地支持numpy类型,而不依赖于numpy

Python键入协议默认值

在极性中创建条件累积和

部分视图的DataFrame

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

提取相关行的最快方法—pandas

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

判断solve_ivp中的事件

从一个df列提取单词,分配给另一个列

numpy数组和数组标量之间的不同行为

如何将返回引用的函数与pybind11绑定?

用0填充没有覆盖范围的垃圾箱

与同步和异步客户端兼容的Python函数

如何计算Pandas 中具有特定条件的行之间的天差

如何从具有完整层次数据的Pandas框架生成图形?

如何更改网络中某条边的位置(&Q;)?

以元组为索引的Numpy多维索引