如何解决一列的条件复制元素,并应用于所有满意的行Python数据框
这非常非常简单,不确定我错过了什么。 我必须复制“ primary_fruit”的“ code_num”并将其应用于基于“ fruit_list”的所有引用行。 如果df [fruit]在fruit_list中不存在,则复制自身“ code_num”
fruit_list= ["apple","banana","cherry"]
primary_fruit = 'banana'
print(df)
Store code_num fruits
A 101 apple
A 102 cherry
A 103 cherry
A 104 banana
A 105 cherry
A 106 rambo
B 201 cherry
B 202 banana
B 203 toy
预期数据框:
Store code_num fruits reference
A 101 apple 104
A 102 cherry 104
A 103 cherry 104
A 104 banana 104
A 105 cherry 104
A 106 rambo 106
B 201 cherry 202
B 202 banana 202
B 203 toy 203
下面我写的代码给出了错误的输出:
s = df['fruits'].isin(fruit_list)
df.loc[s,'reference'] = df.groupby([s,'Store'])['code_num'].transform('max')
解决方法
检查
df['refer']=df['code_num']
df.loc[df.fruits.isin(fruit_list),'refer']=df.loc[df.fruits.eq(primary_fruit),'refer'].iloc[0]
df
Out[26]:
Store code_num fruits refer
0 A 101 apple 104
1 A 102 cherry 104
2 A 103 cherry 104
3 A 104 banana 104
4 A 105 cherry 104
5 A 106 rambo 106
与Categorical
相比,我们需要transform
并重新排序数据框
d=dict.fromkeys( fruit_list,primary_fruit)
newdf = df.iloc[pd.Categorical(df.fruits,["banana","apple","cherry"]).argsort()]
df['ref']=newdf.groupby([newdf.Store,newdf.fruits.replace(d) ])['code_num'].transform('first')
df
Out[46]:
Store code_num fruits ref
0 A 101 apple 104
1 A 102 cherry 104
2 A 103 cherry 104
3 A 104 banana 104
4 A 105 cherry 104
5 A 106 rambo 106
6 B 201 cherry 202
7 B 202 banana 202
8 B 203 toy 203
,
您可以尝试:
primary_code = df.query('fruits == @primary_fruit')['code_num'].values[0]
df['reference'] = df['code_num'].where(~df['fruits'].isin(fruit_list),primary_code)
更新为包含Store
primary_codes = (
df
.set_index('Store')
.query('fruits == @primary_fruit')['code_num']
.to_dict()
)
df['reference'] = df.apply(lambda x:
x['code_num']
if x['fruits'] not in fruit_list
else primary_codes.get(x['Store']),axis=1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。