簡體   English   中英

在列上連接 pandas DataFrames,類似於外部合並

[英]Concatenate pandas DataFrames on columns, similar to outer merge

我有 3 個數據框,每個數據框的第一列都有日期。 我想連接這些數據幀,但連接與每個數據幀的行值相關。 如果值匹配,則在同一行添加,否則,我希望有一個 NaN。

import numpy as np
import pandas as pd

# Create the pandas DataFrame
df1 = pd.DataFrame(['2018-12-31','2019-09-30','2022-01-31'], columns = ['Date1'])
df2 = pd.DataFrame(['2019-09-30','2022-02-28'], columns = ['Date2'])
df3 = pd.DataFrame(['2019-09-30','2021-06-30','2021-11-30','2022-03-31'], columns = ['Date3'])

display(df1)
display(df2)
display(df3)

data = {'Date1': ['2018-12-31','2019-09-30',np.nan,np.nan,'2022-01-31',np.nan,np.nan],
        'Date2': [np.nan,'2019-09-30',np.nan,np.nan,np.nan,'2022-02-28',np.nan],
        'Date3': [np.nan,'2019-09-30','2021-06-30','2021-11-30',np.nan,np.nan,'2022-01-31']}

desired_df = pd.DataFrame(data)
desired_df

這就是我想要實現的目標。

日期 1 日期2 日期 3
0 2018-12-31 鈉鹽 鈉鹽
1個 2019-09-30 2019-09-30 2019-09-30
2個 鈉鹽 鈉鹽 2021-06-30
3個 鈉鹽 鈉鹽 2021-11-30
4個 2022-01-31 鈉鹽 鈉鹽
5個 鈉鹽 2022-02-28 鈉鹽
6個 鈉鹽 鈉鹽 2022-01-31

我最初的想法是使用類似的東西:

pd.concat([df1,df2,df3], axis=1, join="outer")

然而,上面會產生類似的東西:

日期 1 日期2 日期 3
2018-12-31 2019-09-30 2019-09-30
2019-09-30 2022-02-28 2021-06-30
2022-01-31 鈉鹽 2021-11-30
鈉鹽 鈉鹽 2022-03-31

我們可以使用日期設置set_index (通過將drop參數設置為 False,我們不會丟失該列),然后concat

out = (pd.concat([df.set_index(f'Date{i+1}', drop=False) 
                 for i, df in enumerate([df1, df2, df3])], axis=1)
       .sort_index().reset_index(drop=True))

Output:

        Date1       Date2       Date3
0  2018-12-31         NaN         NaN
1  2019-09-30  2019-09-30  2019-09-30
2         NaN         NaN  2021-06-30
3         NaN         NaN  2021-11-30
4  2022-01-31         NaN         NaN
5         NaN  2022-02-28         NaN
6         NaN         NaN  2022-03-31

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM