python - 将匹配值从一个df复制到另一个给定的多个条件
问题描述
我有两个数据框。第一个,df1,有一个非唯一的 ID 和一个以 ms 为单位的时间戳值。另一个 df2 具有非唯一 ID、单独的唯一 ID、开始时间和结束时间(均以毫秒为单位)。
我需要从 df2 获取 df1 中每一行的正确唯一 ID。我会这样做...
- 将 df1 中的每个非唯一 ID 与 df2 中的相关行系列匹配
- 在这些行中,找到包含 df1 中时间戳的开始和结束范围的行
- 从结果行中获取唯一 ID 并将其复制到 df1 中的新列
我认为我不能使用 pd.merge,因为我需要将 df1 时间戳与 df2 中的两个不同列进行比较。我认为 df.apply 是我的答案,但我无法弄清楚。
这是一些虚拟代码:
df1_dict = {
'nonunique_id': ['abc','def','ghi','jkl'],
'timestamp': [164.3,2071.2,1001.7,846.4]
}
df2_dict = {
'nonunique_id': ['abc','abc','def','def','ghi','ghi','jkl','jkl'],
'unique_id': ['a162c1','md85k','dk102','l394j','dj4n5','s092k','dh567','57ghed0'],
'time_start': [160,167,2065,2089,1000,1010,840,876],
'time_end': [166,170,2088,3000,1009,1023,875,880]
}
df1 = pd.DataFrame(data=df1_dict)
df2 = pd.DataFrame(data=df2_dict)
这是手动测试...
df2['unique_id'][(df2['nonunique_id'].eq('abc')) & (df2['time_start']<=164.3) & (df2['time_end']>=164.3)]
...返回预期的输出(来自 df2 的相关唯一 ID):
0 a162c1
名称:unique_id,数据类型:对象
我想要一个可以自动应用上述手动测试的功能,并将结果复制到 df1 中的新列。
我试过这个...
def unique_id_fetcher(nonunique_id,timestamp):
cond_1 = df2['nonunique_id'].eq(nonunique_id)
cond_2 = df2['time_start']<=timestamp
cond_3 = df2['time_end']>=timestamp
unique_id = df2['unique_id'][(cond_1) & (cond_2) & (cond_3)]
return unique_id
df1['unique_id'] = df1.apply(unique_id_fetcher(df1['nonunique_id'],df1['timestamp']))
...但这会导致:
ValueError:只能比较标签相同的系列对象
(为清楚起见进行了编辑)
解决方案
国际大学联合会,
您可以对两个数据框进行 caretsian 乘积并进行合并,然后应用您的逻辑
您创建一个 dict 并将值映射回您的 df1 使用 non_unique_id 作为键。
df1['key'] = 'var'
df2['key'] = 'var'
df3 = pd.merge(df1,df2,on=['key','nonunique_id'],how='outer')
df4 = df3.loc[
(df3["timestamp"] >= df3["time_start"]) & (df3["timestamp"] <= df3["time_end"])
]
d = dict(zip(df4['nonunique_id'],df4['unique_id']))
df1['unique_id'] = df1['nonunique_id'].map(d)
print(df1.drop('key',axis=1))
nonunique_id timestamp unique_id
0 abc 164.3 a162c1
1 def 2071.2 dk102
2 ghi 1001.7 dj4n5
3 jkl 846.4 dh567
推荐阅读
- python - Excel 从 .bin 文件中删除我的 VBA 项目
- forms - 在 OKTA.AspNet 和基于表单的身份验证 MVC#4 上需要帮助
- security - 拒绝对所有人的写入,同时阻止读取访问 (icacls)
- ios - 在 SwiftUI 中设置 Apple SSO 按钮尺寸
- python-3.x - 重新创建 postgresql 数据库来做 pytest
- r - 我的因子变量回归是否在做我认为 Diff in Diff (r) 的回归?
- angular - AngularFireModule 注入
- php - woocommerce 订单获取商品名称并将其推送到 api
- excel - Excel 公式 - 基于多个值获取行
- android - Android照片库识别新添加的图像很慢(缓存问题?)