如何在不复制列的情况下合并数据?
How do I merge data without duplicating the columns?
假设我有多个数据帧 df1、df2、df3(实际上,我有大约 11 个数据帧)。这些从 excel 个工作表转换为数据框。
示例目的:
DateTime | Col1 | Col2 | Col3 |
----------------
jan | 20 | 30 | 40 |
Feb | NaN | NaN| NaN |
Mar | NaN | NaN | NaN |
Apr | NaN |NaN | NaN |
| Col1 | Col2 | Col3 |
----------------
jan | NaN | NaN | NaN |
Feb | 20 | 30 | 40 |
Mar | NaN | NaN | NaN |
Apr | NaN |NaN | NaN |
| Col1 | Col2 | Col3 |
----------------
jan | NaN | NaN | NaN |
Feb | NaN | NaN | NaN |
Mar | 10 | 20 | 80 |
Apr | NaN |NaN | NaN |
我希望输出为
Out= DateTime | Col1 | Col2 | Col3 |
----------------
jan | 20 | 30 | 40 |
Feb | 20 | 30 | 0 |
Mar | 10 | 20 | 80 |
Apr | NaN |NaN | NaN |
比如说,有多个列但所有电子表格中的名称都相同,有多个行但日期列在所有电子表格中具有相同的行数和名称。我尝试加入、合并和连接,但它们要么覆盖值,要么添加额外的行或列。最后,我希望输出具有相同的行数和列数。
我是 python 的新手,所以想弄明白!
将 concat
与聚合 sum
结合使用,使用列 date
的解决方案:
df = pd.concat([df1, df2, df3]).groupby('date', sort=False).sum(min_count=1)
如果使用 DatetimeIndex:
df = pd.concat([df1, df2, df3]).groupby(level=0, sort=False).sum(min_count=1)
print (df)
Col1 Col2 Col3
jan 20.0 30.0 40.0
Feb 20.0 30.0 40.0
Mar 10.0 20.0 80.0
Apr NaN NaN NaN
对于问题中提供的示例,您也可以执行简单的sum
。该操作将在 index/columns.
上自动对齐
示例输入(添加了 NaN):
df1 = pd.DataFrame({'Col1': [20, 0, 0], 'Col2': [30, 0, 0], 'Col3': [40, 0, 0]},
index=['Jan', 'Feb', 'Mar'])
df2 = pd.DataFrame({'Col1': [0, 20, 0], 'Col2': [0, 30, 0], 'Col3': [0, 40, np.nan]},
index=['Jan', 'Feb', 'Mar'])
df3 = pd.DataFrame({'Col1': [0, 0, 10], 'Col2': [0, 0, 20], 'Col3': [0, 0, 80]},
index=['Jan', 'Feb', 'Mar'])
代码:
dfs = [df1, df2, df3]
df_out = sum(dfs)
输出:
Col1 Col2 Col3
Jan 20 30 40.0
Feb 20 30 40.0
Mar 10 20 NaN
注意。如果您有其他列,请定义行为
假设我有多个数据帧 df1、df2、df3(实际上,我有大约 11 个数据帧)。这些从 excel 个工作表转换为数据框。
示例目的:
DateTime | Col1 | Col2 | Col3 |
----------------
jan | 20 | 30 | 40 |
Feb | NaN | NaN| NaN |
Mar | NaN | NaN | NaN |
Apr | NaN |NaN | NaN |
| Col1 | Col2 | Col3 |
----------------
jan | NaN | NaN | NaN |
Feb | 20 | 30 | 40 |
Mar | NaN | NaN | NaN |
Apr | NaN |NaN | NaN |
| Col1 | Col2 | Col3 |
----------------
jan | NaN | NaN | NaN |
Feb | NaN | NaN | NaN |
Mar | 10 | 20 | 80 |
Apr | NaN |NaN | NaN |
我希望输出为
Out= DateTime | Col1 | Col2 | Col3 |
----------------
jan | 20 | 30 | 40 |
Feb | 20 | 30 | 0 |
Mar | 10 | 20 | 80 |
Apr | NaN |NaN | NaN |
比如说,有多个列但所有电子表格中的名称都相同,有多个行但日期列在所有电子表格中具有相同的行数和名称。我尝试加入、合并和连接,但它们要么覆盖值,要么添加额外的行或列。最后,我希望输出具有相同的行数和列数。
我是 python 的新手,所以想弄明白!
将 concat
与聚合 sum
结合使用,使用列 date
的解决方案:
df = pd.concat([df1, df2, df3]).groupby('date', sort=False).sum(min_count=1)
如果使用 DatetimeIndex:
df = pd.concat([df1, df2, df3]).groupby(level=0, sort=False).sum(min_count=1)
print (df)
Col1 Col2 Col3
jan 20.0 30.0 40.0
Feb 20.0 30.0 40.0
Mar 10.0 20.0 80.0
Apr NaN NaN NaN
对于问题中提供的示例,您也可以执行简单的sum
。该操作将在 index/columns.
示例输入(添加了 NaN):
df1 = pd.DataFrame({'Col1': [20, 0, 0], 'Col2': [30, 0, 0], 'Col3': [40, 0, 0]},
index=['Jan', 'Feb', 'Mar'])
df2 = pd.DataFrame({'Col1': [0, 20, 0], 'Col2': [0, 30, 0], 'Col3': [0, 40, np.nan]},
index=['Jan', 'Feb', 'Mar'])
df3 = pd.DataFrame({'Col1': [0, 0, 10], 'Col2': [0, 0, 20], 'Col3': [0, 0, 80]},
index=['Jan', 'Feb', 'Mar'])
代码:
dfs = [df1, df2, df3]
df_out = sum(dfs)
输出:
Col1 Col2 Col3
Jan 20 30 40.0
Feb 20 30 40.0
Mar 10 20 NaN
注意。如果您有其他列,请定义行为