pandas 如何在两个 Dataframe 之间获得基于多个条件的 Dataframe 中的新列?

nfeuvbwi  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(185)

我有两个 Dataframe ,我希望在DF 1中找到一个列,该列将包含“当前日期”列的值加上与DF 2中相关状态和技术相关的天数。例如,在下面“新日期”列中的第一个值为18/03/2022 + 1095天,因为它正在检查是否技术=风力和状态=施工。
东风1
| 当前日期|技术|工作状态|新日期 * 要求来源代码 *|
| - ------|- ------|- ------|- ------|
| 2022年3月18日|风|建筑|二〇二二年十二月十六日|
| 2022年2月15日|太阳能|建筑|2022年11月15日|
| 2022年1月24日|电池|批准申请|二○二二年十月二十四日|
| 2020年9月23日|风|批准申请|二○二三年三月二十四日|
| 2021年11月18日|太阳能|已提交申请|2023年11月18日|
| 2020年6月25日|太阳能|批准申请|2021年3月25日|
| 2020年2月27日|风|已提交申请|2025年2月25日|
| 2022年3月10日|电池|已提交申请|2024年3月9日|
东风2
| 技术|已提交申请|批准申请|建筑|
| - ------|- ------|- ------|- ------|
| 电池|七三○|二百七十三点七五分|二百七十三点七五分|
| 太阳能光伏|七三○|二百七十三点七五分|二百七十三点七五分|
| 风|小行星1825|小行星912.5|小行星1095|
| | | | |

fykwrbwg

fykwrbwg1#

使用DataFrame.melt,通过to_timedelta将值转换为时间增量(如果需要更高的精度,请删除.astype(int)):

df2 = (df2.melt('Technology', var_name='Status', value_name='New Date')
          .assign(**{'New Date': 
                    lambda x: pd.to_timedelta(x['New Date'].astype(int), unit='d')}))
print (df2)
            Technology                 Status  New Date
0              Battery  Application submitted  730 days
1  Solar Photovoltaics  Application submitted  730 days
2                 Wind  Application submitted 1825 days
3              Battery   Application approved  273 days
4  Solar Photovoltaics   Application approved  273 days
5                 Wind   Application approved  912 days
6              Battery           Construction  273 days
7  Solar Photovoltaics           Construction  273 days
8                 Wind           Construction 1095 days

然后使用左连接并添加列Current Date

df = df1.merge(df2, on=['Technology','Status'], how='left')
df['New Date'] += pd.to_datetime(df['Current Date'], dayfirst=True)
print (df)
  Current Date Technology                 Status   New Date
0   18/03/2022       Wind           Construction 2025-03-17
1   15/02/2022      Solar           Construction        NaT
2   24/01/2022    Battery   Application approved 2022-10-24
3   23/09/2020       Wind   Application approved 2023-03-24
4   18/11/2021      Solar  Application submitted        NaT
5   25/06/2020      Solar   Application approved        NaT
6   27/02/2020       Wind  Application submitted 2025-02-25
7   10/03/2022    Battery  Application submitted 2024-03-09

对于匹配Solar Photovoltaics值,可以使用拆分并选择第一个值:

df2['Technology'] = df2['Technology'].str.split().str[0]

df2 = (df2.melt('Technology', var_name='Status', value_name='New Date')
          .assign(**{'New Date':  
                  lambda x: pd.to_timedelta(x['New Date'].astype(int), unit='d')}))
print (df2)
  Technology                 Status  New Date
0    Battery  Application submitted  730 days
1      Solar  Application submitted  730 days
2       Wind  Application submitted 1825 days
3    Battery   Application approved  273 days
4      Solar   Application approved  273 days
5       Wind   Application approved  912 days
6    Battery           Construction  273 days
7      Solar           Construction  273 days
8       Wind           Construction 1095 days

df = df1.merge(df2, on=['Technology','Status'], how='left')
df['New Date'] += pd.to_datetime(df['Current Date'], dayfirst=True)
print (df)
  Current Date Technology                 Status   New Date
0   18/03/2022       Wind           Construction 2025-03-17
1   15/02/2022      Solar           Construction 2022-11-15
2   24/01/2022    Battery   Application approved 2022-10-24
3   23/09/2020       Wind   Application approved 2023-03-24
4   18/11/2021      Solar  Application submitted 2023-11-18
5   25/06/2020      Solar   Application approved 2021-03-25
6   27/02/2020       Wind  Application submitted 2025-02-25
7   10/03/2022    Battery  Application submitted 2024-03-09

相关问题