Pandas 如何将一列复制到另一个具有相似索引的数据帧

时间:2021-01-22 04:40:14

标签: python pandas dataframe

我有一个如下所示的 Pandas 数据框。我使用 pd.to_datetime(df['date']).dt.normalize() 来获取 date2 列以仅显示日期并忽略时间。不知道如何让它只是 YYYY-MM-DD 格式。

                       date2  count  compound_mean
0  2021-01-01 00:00:00+00:00     18       0.188411
1  2021-01-02 00:00:00+00:00      9       0.470400
2  2021-01-03 00:00:00+00:00     10       0.008190
3  2021-01-04 00:00:00+00:00     58       0.187510
4  2021-01-05 00:00:00+00:00    150       0.176173

具有以下格式的另一个数据框。

Date          Average
2021-01-04    18.200001
2021-01-05    22.080000
2021-01-06    22.250000
2021-01-07    22.260000
2021-01-08    21.629999

我希望通过匹配日期然后向前填充任何空白值,使 Average 列显示在第一个数据框中。从 01-01 到 01-03 将没有任何东西可以向前填充,所以我猜它最终会为零。我无法找到合适的 Pandas 函数来执行此操作,正在寻找一些指导。谢谢。

3 个答案:

答案 0 :(得分:1)

尝试以下操作:

>>> df.index = pd.to_datetime(df.date2).dt.date 
# If df.date2 is already datetime, use ^ df.index = df.date2.dt.date
>>> df2['Date'] = pd.to_datetime(df2['Date']) 
# If df2['Date'] is already datetime, ^ this above line is not needed
>>> df.join(df2.set_index('Date')).fillna(0)
                                date2  count  compound_mean    Average
date2                                                                 
2021-01-01  2021-01-01 00:00:00+00:00     18       0.188411   0.000000
2021-01-02  2021-01-02 00:00:00+00:00      9       0.470400   0.000000
2021-01-03  2021-01-03 00:00:00+00:00     10       0.008190   0.000000
2021-01-04  2021-01-04 00:00:00+00:00     58       0.187510  18.200001
2021-01-05  2021-01-05 00:00:00+00:00    150       0.176173  22.080000

答案 1 :(得分:1)

您可以执行merge操作如下:

#Making date of same UTC format from both tables
df1['date2'] = pd.to_datetime(df1['date2'],utc = True)
df2['Date'] = pd.to_datetime(df2['Date'],utc = True)

#Renaming df1 column so that we can map 'Date' from both dataframes
df1.rename(columns={'date2': 'Date'},inplace=True)

#Merge operation
res = pd.merge(df1,df2,on='Date',how='left').fillna(0)

输出:

Date    count   compound_mean   Average
0   2021-01-01 00:00:00+00:00   18  0.188411    0.000000
1   2021-01-02 00:00:00+00:00   9   0.470400    0.000000
2   2021-01-03 00:00:00+00:00   10  0.008190    0.000000
3   2021-01-04 00:00:00+00:00   58  0.187510    18.200001
4   2021-01-05 00:00:00+00:00   150 0.176173    22.080000

答案 2 :(得分:1)

我假设您的第一个数据帧是 df1,第二个数据帧是 df2。

首先,您需要将 df1 的 date2 列的名称更改为 Date,使其与您的 df2 的 Date 列匹配。

df1['Date'] = pd.to_datetime(df1['date2']).dt.date

然后您可以将 df1 的 date2 列删除为

df1.drop("date2",inplace=True, axis=1)

您还需要更改df2的Date列类型,使其与df1的Date列的类型匹配

df2['Date'] = pd.to_datetime(df2['Date']).dt.date

然后创建一个新的数据框,其中将包含基于日期列的两个数据框列。

main_df = pd.merge(df1,df2,on="Date", how="left")
df1['Average'] = main_df['Average']
df1 = pd.DataFrame(df1, columns = ['Date', 'count','compound_mean','Average'])

然后你可以用 ffill 填充空值,也可以用 0 填充前 3 个空值

df1.fillna(method='ffill', inplace=True)
df1.fillna(0, inplace=True)

您的第一个数据框将看起来像您想要的