0

假设我有两个 dfs

Date         x  y                 
2021-07-01  1  2
2021-07-02  2  4
2021-07-06  3  6
2021-07-07  4  8
2021-07-08  5  10

Date    z   n
2021-07-06  5  10
2021-07-07  6  12
2021-07-08  7  14

我怎样才能根据日期组合它们以便我得到。我有相当多的 dfs 可以使用迭代过程进行组合。

Date         x  y  z  n           
2021-07-01  1  2  nan  nan          
2021-07-02  2  4  nan  nan
2021-07-06  3  6  5  10
2021-07-07  4  8  6  12
2021-07-08  5  10  7  14
4

4 回答 4

2

使用merge

>>> pd.merge(df1, df2, on='Date', how='outer')
         Date  x   y    z     n
0  2021-07-01  1   2  NaN   NaN
1  2021-07-02  2   4  NaN   NaN
2  2021-07-06  3   6  5.0  10.0
3  2021-07-07  4   8  6.0  12.0
4  2021-07-08  5  10  7.0  14.0
于 2021-07-25T19:56:28.417 回答
1

鉴于有“相当多的 dfs 要组合”使用pd.concaton axis=1,但使用列表推导 withset_index以确保与Date列正确对齐:

# dfs is a list of DataFrames
df = pd.concat([f.set_index('Date') for f in dfs], axis=1).reset_index()

或者functools.reduce也可以用于merge

from functools import reduce


# dfs is a list of DataFrames
df = reduce(lambda a, b: pd.merge(a, b, on='Date', how='outer'), dfs)

df

         Date  x   y    z     n
0  2021-07-01  1   2  NaN   NaN
1  2021-07-02  2   4  NaN   NaN
2  2021-07-06  3   6  5.0  10.0
3  2021-07-07  4   8  6.0  12.0
4  2021-07-08  5  10  7.0  14.0

示例 DataFrames 和导入:

from functools import reduce

import pandas as pd

df1 = pd.DataFrame({
    'Date': ['2021-07-01', '2021-07-02', '2021-07-06', '2021-07-07',
             '2021-07-08'],
    'x': [1, 2, 3, 4, 5],
    'y': [2, 4, 6, 8, 10]
})

df2 = pd.DataFrame({
    'Date': ['2021-07-06', '2021-07-07', '2021-07-08'], 'z': [5, 6, 7],
    'n': [10, 12, 14]
})

dfs = [df1, df2]
于 2021-07-25T20:08:18.680 回答
0

你可以使用像 concat 这样的东西

https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

import pandas as pd
a = pd.DataFrame([[1,2,3],[4,5,6]],columns = ['Date','x','y'])
b = pd.DataFrame([[1,7,9],[3,8,2]],columns = ['Date','z','n'])
final = pd.concat([a,b])
于 2021-07-25T20:02:28.700 回答
0

由于您有“相当少”数量的数据帧,因此最好将合并操作与 reduce 结合起来。

这个解决方案使用mergepartialfromfunctools模块来组合一个可迭代的DataFrames,每个都有一个Date列。我假设您想保留Date索引,并且merge会这样做。

import functools
merge_outer=functools.partial(pd.merge, how="outer", on="Date")
df = functools.reduce(merge_outer, [df1, df2, df3])
于 2021-07-25T22:15:02.917 回答