python - 一列中一个元素的条件复制并应用于python中的相应行
问题描述
在我的以下数据框中,我想为其关联的 primary_fruit 创建一个带有 code_num 的新列“refer”,如果它不与 priamry_fruit 关联,则应将其留空。
dct = {'Store': ('A','A','A','A','A','A','B','B','B'),
'code_num':(101,102,103,104,105,106,201,202,203),
'fruits': ('apple','cherry','cherry, apple','banana','cherry','rambo','apple, cherry','banana','toy')
}
df = pd.DataFrame(dct)
fruit_list= ["apple","banana","cherry"]
primary_fruit = 'banana'
print(df)
Store code_num fruits
A 101 apple
A 102 cherry
A 103 cherry,apple
A 104 banana
A 105 cherry
A 106 rambo
B 201 apple,cherry
B 202 banana
B 203 toy
预期数据框:
Store code_num fruits reference
A 101 apple 104
A 102 cherry 104
A 103 cherry,apple 104
A 104 banana 104
A 105 cherry 104
A 106 rambo
B 201 apple,cherry 202
B 202 banana 202
B 203 toy
在我目前的问题中,我不希望 106 和 203 中的值,因为它们不是“fruit_list”的一部分
我已经尝试过下面的代码,但它只是获取了primary_fruit(104和202)的参考号,其余的都留空
unique_store_id = df.Store.unique()
for store_id in unique_store_id:
s = (df.Store == store_id) & df['fruits'].isin(unique_all_parts)
primary_code = df[df['fruits']==first_primary]['code_num']
df.loc[s,'reference'] = primary_code
感谢您的帮助 :)
更新: @Scott Boston 的建议在完整数据集上运行良好。但是在切片/切块的情况下,它会给出一个 [KeyError: 'None'],我将不得不使用这个逻辑来对每个商店的切片数据帧应用,其中“fruit_list”和“primary_fuit”将被更改。(我应该在最初的问题中包含我的歉意。) 概念:基于每个商店的主要水果,应在参考中提供代码编号
解决方案
试试这个:
dct = {'Store': ('A','A','A','A','A','A','B','B','B'),
'code_num':(101,102,103,104,105,106,201,202,203),
'fruits': ('apple','cherry','cherry, apple','banana','cherry','rambo','apple, cherry','banana','toy')
}
df = pd.DataFrame(dct)
fruit_list= ["apple","banana","cherry"]
primary_fruit = 'banana'
m = df.set_index(['Store', 'code_num'])['fruits'].str.split(',').explode().isin(fruit_list).max(level=[0,1]).to_numpy()
df['primary_code'] = df.loc[df['fruits'] == primary_fruit, 'code_num']
#Changed this line
df['reference'] = df.groupby('Store')['primary_code'].transform(lambda x: x.loc[x.first_valid_index()]).where(m, '')
df_out = df.drop('primary_code', axis=1)
print(df_out)
输出:
Store code_num fruits reference
0 A 101 apple 104
1 A 102 cherry 104
2 A 103 cherry, apple 104
3 A 104 banana 104
4 A 105 cherry 104
5 A 106 rambo
6 B 201 apple, cherry 202
7 B 202 banana 202
8 B 203 toy
推荐阅读
- r - 在 dplyr 中应用带有 cross() 的 summarise() 函数时出错
- sql - 在基于行的字段/值表上处理复杂的查询
- java - 如何保护您的 API 免受了解您 API 的开发人员的攻击?
- angular - 从 Angular 的 RXJS/NGRX 存储中获取不可变项以在组件中编辑的最佳实践
- android - 在 x 轴上滑动时锁定水平 RecyclerView 中的 Y 轴滚动
- javascript - 如何在赛普拉斯(vscode)中进行自定义命令实现
- angular - 解析 mailto.api 期间的 HTTP 失败
- php - Elementor Widget 无法找到我的班级,返回致命错误
- java - 为什么 swing gui 的行为很奇怪?
- amazon-web-services - Glue 无法读取 S3 存储桶