通过连接多个(日期,价格)数据框与一些缺失值创建带有日期索引的Pandas数据框[重复]

ajsxfq5m  于 2023-02-02  发布在  其他
关注(0)|答案(1)|浏览(103)
    • 此问题在此处已有答案**:

Pandas Merging 101(8个答案)
2天前关闭。
我有一些食品杂货的以下日期和价格数据,其中一些商品缺少某些月份的记录。例如,面包有2022年所有月份的数据,但果汁等商品缺少值。例如:

    • 面包_ Dataframe **

| 日期|价格|
| - ------|- ------|
| 2022年1月1日|四、二|
| 2022年2月1日|4.0版|
| 2022年3月1日|四、一|
| 2022年4月1日|三、一|
| 2022年5月1日|二、一|
| ...|...|

    • 果汁_ Dataframe **

| 日期|价格|
| - ------|- ------|
| 2022年1月1日|三、二|
| 2022年4月1日|四、一|
| 2022年5月1日|五、一|
| ...|...|
等等。
我的目标是创建一个带有日期索引和表示每个项目的列的单个 Dataframe ,NaN显示任何没有价格的月份/价格项目。
| 日期|面包|果汁|...|
| - ------|- ------|- ------|- ------|
| 2022年1月1日|四、二|三、二||
| 2022年2月1日|4.0版|钠氮||
| 2022年3月1日|四、一|钠氮||
| 2022年4月1日|三、二|四、一||
| 2022年5月1日|二、一|五、一||
到目前为止,我已经尝试创建items_dict[item_name] = pd.DataFrame({'Date': dates, 'Price': item_price})的字典,然后使用pd.concat(items_dict, axis=1),但这只返回这种类型的 Dataframe 。
| 日期|("面包"、"价格")|("果汁"、"价格")|...|
| - ------|- ------|- ------|- ------|
| 2022年1月1日||||
| 2022年2月1日||||
| 2022年3月1日||||
| 2022年4月1日||||
| 2022年5月1日||||
任何帮助都将不胜感激。

hfsqlsce

hfsqlsce1#

在面包 Dataframe 和果汁 Dataframe 中,将date列转换为datetime对象。然后,在这两个 Dataframe 中,将date列作为索引。为了区分重复的列名,使用pd.merge函数合并date索引上的两个 Dataframe ,并设置suffixes参数。最后,使用pd.pivot方法透视合并后的 Dataframe ,将date作为索引。项目名称作为列,价格作为值。
下面是代码:

import pandas as pd

bread_dataframe['Date'] = pd.to_datetime(bread_dataframe['Date'], format='%m/%d/%y')
juice_dataframe['Date'] = pd.to_datetime(juice_dataframe['Date'], format='%m/%d/%y')

bread_dataframe.set_index('Date', inplace=True)
juice_dataframe.set_index('Date', inplace=True)

merged_df = pd.merge(bread_dataframe, juice_dataframe, left_index=True, right_index=True, suffixes=('_bread', '_juice'))
pivoted_df = merged_df.pivot(columns='item', values='Price')

这将生成所需的单个 Dataframe ,其中包含日期索引和表示每个项目的列,对于我们没有价格的任何月份/价格项目,将显示NaN。
编辑:对于多个 Dataframe ,您可以只使用for循环来迭代 Dataframe 列表。

import pandas as pd
dataframes = [bread_dataframe, juice_dataframe, ...]
result = None
for i, df in enumerate(dataframes):
    df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%y')
    df.set_index('Date', inplace=True)
    if i == 0:
        result = df
    else:
        result = pd.merge(result, df, left_index=True, right_index=True, suffixes=('', f'_{i}'))            
pivoted_df = result.pivot(columns='item', values='Price')

相关问题