首页 > 解决方案 > 一列中一个元素的条件复制并应用于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”将被更改。(我应该在最初的问题中包含我的歉意。) 概念:基于每个商店的主要水果,应在参考中提供代码编号

标签: pythonpython-3.xpandaspandas-groupbyseries

解决方案


试试这个:

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          

推荐阅读