熊猫复制列元素并基于相关列表应用于另一列

坏蛋

这是一个棘手的问题,很长一段时间以来我一直在头。我有以下数据框。

dct = {'Store': ('A','A','A','A','A','A','B','B','B','C','C','C'),
       'code_num':('INC101','INC102','INC103','INC104','INC105','INC106','INC201','INC202','INC203','INC301','INC302','INC303'),
       'days':('4','18','9','15','3','6','10','5','3','1','8','5'),
       'products': ('remote','antenna','remote, antenna','TV','display','TV','display, touchpad','speaker','Cell','display','speaker','antenna')
}

df = pd.DataFrame(dct)

pts = {'Primary': ('TV','TV','TV','Cell','Cell'),
         'Related' :('remote','antenna','speaker','display','touchpad')
    
}

parts = pd.DataFrame(pts)

print(df)


   Store code_num days           products
0      A   INC101    4             remote
1      A   INC102    18            antenna
2      A   INC103    9    remote, antenna
3      A   INC104   15                 TV
4      A   INC105    3            display
5      A   INC106    6                 TV
6      B   INC201   10  display, touchpad
7      B   INC202    5            speaker
8      B   INC203    3               Cell
9      C   INC301    1            display
10     C   INC302    8            speaker
11     C   INC303    5            antenna

零件数据框仅供参考,我还有另一段代码,将提供相关零件的列表以及每个商店的主要零件。

#对于商店A->电视:['remote','antenna','peaker'];商店B->单元格:['display','touchpad'],我期望的数据帧是:

   Store code_num days           products      refer
0      A   INC101    4             remote      INC106
1      A   INC102   18            antenna              -> omitted in 1st pass; because >10 days
2      A   INC103    9    remote, antenna      INC106
3      A   INC104   15                 TV              -> omitted in 1st pass; because >10 days
4      A   INC105    3            display      
5      A   INC106    6                 TV      INC106
6      B   INC201   10  display, touchpad      INC203
7      B   INC202    5            speaker      
8      B   INC203    3               Cell      INC203
9      C   INC301    1            display              -> blank because no primary present
10     C   INC302    8            speaker              -> blank because no primary present
11     C   INC303    5            antenna              -> blank because no primary present

我有适合一次执行整个df的代码。但是由于其他业务规则,这将是一片数据含义2和3将被省略,因此,.iloc值对于某些记录可能有所不同。因此,如果您在<= 10天内将df子集化,并且为您工作,那么它将对我有用。
如果需要更多信息,请告诉我。我知道这很复杂,实际上是个脑筋急转弯。

Madhanlal

复制了方案:

您的输入:

dct = {'Store': ('A','A','A','A','A','A','B','B','B','C','C','C'),
       'code_num':('INC101','INC102','INC103','INC104','INC105','INC106','INC201','INC202','INC203','INC301','INC302','INC303'),
       'days':('4','18','9','15','3','6','10','5','3','1','8','5'),
       'products': ('remote','antenna','remote,antenna','TV','display','TV','display,touchpad','speaker','Cell','display','speaker','antenna')
}

df = pd.DataFrame(dct)
pts = {'Primary': ('TV','TV','TV','Cell','Cell'),
         'Related' :('remote','antenna','speaker','display','touchpad')
    
}

parts = pd.DataFrame(pts)
store = {'A':'TV','B':'Cell'}

解:

将部分df转换为Dictionary:

 parts_df_dict = dict(zip(parts['Related'],parts['Primary']))

拆分逗号分隔的子产品,并将其分隔为几行:

new_df = pd.DataFrame(df.products.str.split(',').tolist(), index=df.code_num).stack()
new_df = new_df.reset_index([0, 'code_num'])
new_df.columns = ['code_num', 'Prod_seperated']
new_df = new_df.merge(df, on='code_num', how='left')

创建引用列的逻辑:

store_prod = {}
for k,v in store.items():
    store_prod[k] = k+'_'+v
new_df['prod_store'] = new_df['Store'].map(store_prod)
new_df['p_store'] = new_df['Store'].map(store)
new_df['main_ind'] = ' '
new_df.loc[(new_df['prod_store']==new_df['Store']+'_'+new_df['Prod_seperated'])&(new_df['days'].astype('int')<10),'main_ind']=new_df['code_num']
refer_dic = new_df.groupby('Store')['main_ind'].max().to_dict()
new_df['prod_subproducts'] = new_df['Prod_seperated'].map(parts_df_dict)
new_df['refer']  = np.where((new_df['p_store']==new_df['prod_subproducts'])&(new_df['days'].astype('int')<=10),new_df['Store'].map(refer_dic),np.nan) 

new_df['refer'].fillna(new_df['main_ind'],inplace=True)
new_df.drop(['Prod_seperated','prod_store','p_store','main_ind','prod_subproducts'],axis=1,inplace=True)
new_df.drop_duplicates(inplace=True)

new_df或所需的输出:

在此处输入图片说明

如果您有任何疑问,请告诉我。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫将列表值从一列应用于另一列

熊猫将条件应用于基于另一列的列值

如何基于应用于另一列的条件设置pandas DataFrames列值

按一列分组,然后将2列应用于列表熊猫

熊猫计算加权滚动平均值并将其应用于另一列

将数据框列中的列表应用于另一列

一列的条件复制元素,并应用于所有满意的行Python数据框

从熊猫数据框中基于另一列的列的每个列表中删除元素

基于同一数据帧的另一列将缩写应用于数据帧的列

根据另一列的值将函数应用于具有不同参数的行熊猫数据框

熊猫将自定义功能应用于由另一列分组的一列的每一行

熊猫将功能应用于具有前一列值的列

熊猫:将了解列类型的函数应用于数据框的每一列

在熊猫中,如何将函数应用于返回两列的每一列

将列表列中的函数应用于另一列(与按组引用 ecdf 相比)

Pandas :将权重应用于另一列,仅适用于某些 id

Pandas:通过将函数应用于另一列的值过滤列?

如何创建将分段函数应用于另一列的结果的列?

无法添加具有应用于另一列的功能的新列

巴特沃斯过滤器应用于熊猫数据框的一列

按条件应用于熊猫中同一列

将不同的重采样方法应用于同一列(熊猫)

将熊猫列重新分组为基于另一列的2D列表

R按一列分组并将自定义函数应用于另一列

如何从一个列表中获取一个值并将其应用于另一列表中的所有值

熊猫:将功能列表应用于列,每列一个功能

熊猫基于拆分另一列添加新列

熊猫基于另一列的dict值添加列

按年份分组并将功能应用于另一列-Python,Pandas