结合日期和值的两个数据框

Combining two dataframes of dates and values

我从 .csv 文件加载了两个数据帧。一个包含数值,其他日期(月-年)表示这些数值发生的时间。日期和值基本上相互映射。我想 combine/merge 这些数据框将日期作为列,将值作为行。但是,如您所见,日期虽然从左到右排列,但并非都从同一个月开始。

import pandas as pd

df1 = pd.DataFrame(
    [
        [1, 2, pd.NA, pd.NA, pd.NA],
        [2, 3, 4, pd.NA, pd.NA],
        [4, 5, 6, pd.NA, pd.NA],
        [5, 6, 12, 14, 15]
    ]
)

df2 = pd.DataFrame(
    [
        ["2021-01", "2021-02", pd.NA, pd.NA, pd.NA],
        ["2021-02", "2021-03", "2021-04", pd.NA, pd.NA],
        ["2022-03", "2022-04", "2022-05", pd.NA, pd.NA],
        ["2021-04", "2021-05", "2021-06", "2021-07", "2021-08"]
    ]
)

df1

df2

虽然我设法创建了组合数据框,但数据框 df1 和 df2 包含约 300k 行,而且我想到的方法相当慢。 是否有更有效的方法来实现相同的结果?

q = {z: {x: y for x, y in zip(df2.values[z], df1.values[z]) if not pd.isna(y)} for z in range(len(df2))}

df = pd.DataFrame.from_dict(q, orient='index')

idx = pd.to_datetime(df.columns, errors='coerce', format='%Y-%m').argsort()

df.iloc[:, idx]

df3(结果)

你可以stack, concat and pivot:

(pd.concat([df1.stack(), df2.stack()], axis=1)
   .reset_index(level=0)
   .pivot(index='level_0', columns=1, values=0)
   .rename_axis(index=None, columns=None)
)

替代 unstack

(pd.concat([df1.stack(), df2.stack()], axis=1)
   .droplevel(1).set_index(1, append=True)
   [0].unstack(1)
   .rename_axis(columns=None)
)

输出:

  2021-01 2021-02 2021-03 2021-04 2021-05 2021-06 2021-07 2021-08 2022-03 2022-04 2022-05
0       1       2     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
1     NaN       2       3       4     NaN     NaN     NaN     NaN     NaN     NaN     NaN
2     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN       4       5       6
3     NaN     NaN     NaN       5       6      12      14      15     NaN     NaN     NaN

使用concat with keys parameters, so possible after DataFrame.stack and convert MutiIndex to column use DataFrame.pivot:

df = (pd.concat([df1, df2], axis=1, keys=['a','b'])
        .stack()
        .reset_index()
        .pivot('level_0','b','a'))
print (df)
b       2021-01 2021-02 2021-03 2021-04 2021-05 2021-06 2021-07 2021-08  \
level_0                                                                   
0             1       2     NaN     NaN     NaN     NaN     NaN     NaN   
1           NaN       2       3       4     NaN     NaN     NaN     NaN   
2           NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
3           NaN     NaN     NaN       5       6      12      14      15   

b       2022-03 2022-04 2022-05  
level_0                          
0           NaN     NaN     NaN  
1           NaN     NaN     NaN  
2             4       5       6  
3           NaN     NaN     NaN