python - 如何通过比较不同数据框中的列来创建虚拟变量?
问题描述
我想将 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)
也许,有一种更简单的方法可以做到这一点,或者这个函数写得并不好。任何帮助将不胜感激。
解决方案
Series.isin
与转换掩码一起使用1,0
by Series.astype
:
df1['holiday'] = df1['timestamp'].isin(df2['holiday']).astype(int)
或与numpy.where
:
df1['holiday'] = np.where(df1['timestamp'].isin(df2['holiday']), 1, 0)
推荐阅读
- ruby-on-rails - Ruby on Rails 在服务器启动时不会注册 active_admin (http://localhost:3001/admin)
- javascript - 在 Javascript 中创建和访问对象数组
- javascript - 使用 Chrome 开发者工具获取 XXX-xsrfstatemanager.js 文件的发起者
- r - 如何根据多个条件语句创建多个新列?
- python - 如何解决 Python 的“Pyzbar”库上的导入错误?
- c# - wpf c#中的mdf数据库部署问题
- java - 如何从类中隐藏不支持的接口方法
- python - 尝试在 django 中执行表单时,int() 参数必须是字符串
- http - 如何让 mitmproxy 只看 URL 就认为两个请求是相等的?
- python - json.decoder.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)(文件写入)