首页 > 解决方案 > 如何通过比较不同数据框中的列来创建虚拟变量?

问题描述

我想将 df 的一列与不同 df 的另一列进行比较。列是时间戳和假日日期。我想创建一个虚拟变量,其中如果 df1 中的时间戳与 df2 = 1 中的日期匹配,则为 0。

例如,df1:

   timestamp     weight(kg)
0  2016-03-04      4.0
1  2015-02-15      5.0
2  2019-05-04      5.0
3  2018-12-25      29.0
4  2020-01-01      58.0

例如,df2:

   holiday     
0  2016-12-25      
1  2017-01-01      
2  2019-05-01      
3  2018-12-26      
4  2020-05-26

理想输出:

      timestamp     weight(kg)  holiday
0     2016-03-04      4.0         0
1     2015-02-15      5.0         0
2     2019-05-04      5.0         0
3     2018-12-25      29.0        1
4     2020-01-01      58.0        1

我曾尝试编写一个函数,但计算需要很长时间:

def add_holiday(x):
    hols_df = hols.apply(lambda y: y['holiday_dt'] if 
                                x['timestamp'] == y['holiday_dt']
                                                else None, axis=1)
    hols_df = hols_df.dropna(axis=0, how='all')  
    if hols_df.empty:
        hols_df= np.nan
    else: 
        hols_df= hols_df.to_string(index=False)
        
    return hols_df
    

    
#df_hols['holidays'] = df_hols.apply(add_holiday, axis=1)

也许,有一种更简单的方法可以做到这一点,或者这个函数写得并不好。任何帮助将不胜感激。

标签: pythonpandastimestamp

解决方案


Series.isin与转换掩码一起使用1,0by Series.astype

df1['holiday'] = df1['timestamp'].isin(df2['holiday']).astype(int)

或与numpy.where

df1['holiday'] = np.where(df1['timestamp'].isin(df2['holiday']), 1, 0)

推荐阅读