Python中:如果拆分字符串与列值匹配,如何比较并生成新列?

Python中:如果拆分字符串与列值匹配,如何比较并生成新列?,python,pandas,string,dataframe,split,Python,Pandas,String,Dataframe,Split,已获得如下所示的数据帧: 输入数据帧: Store Products located_products 11 AA AA, CC 11 BB AA, CC 11 CC AA, CC 12 AA BB 12 BB BB 12 CC BB Store Products located_products

已获得如下所示的数据帧:

输入数据帧:

Store   Products    located_products    
11      AA          AA, CC
11      BB          AA, CC
11      CC          AA, CC
12      AA          BB
12      BB          BB
12      CC          BB
Store   Products    located_products    Prod_Flag
11      AA          AA, CC              Y
11      BB          AA, CC              
11      CC          AA, CC              Y
12      AA          BB
12      BB          BB                  Y
12      CC          BB
场景: 在商店级别,“定位产品”值将是唯一的-必须按每个字符串拆分,并与“产品”列进行比较。如果值匹配,则新列“Prod_Flag”应包含值“Y”,如果不保留为空

所需数据帧:

Store   Products    located_products    
11      AA          AA, CC
11      BB          AA, CC
11      CC          AA, CC
12      AA          BB
12      BB          BB
12      CC          BB
Store   Products    located_products    Prod_Flag
11      AA          AA, CC              Y
11      BB          AA, CC              
11      CC          AA, CC              Y
12      AA          BB
12      BB          BB                  Y
12      CC          BB
与comapre一起使用,并传递至:

编辑:

每组测试值的解决方案:

print (df)
   Store Products located_products
0     11       AA           AA, DD
1     11       DD           AA, CC
2     11       CC           WW, ZZ
3     12       XX               WW
4     12       WW               ZZ
5     12       ZZ               AA
    
#convert first to columns to index and located_products to multiple columns
df1 = df.set_index(['Store','Products'])['located_products'].str.split(', ', expand=True)
print (df1)
                 0     1
Store Products          
11    AA        AA    DD
      DD        AA    CC
      CC        WW    ZZ
12    XX        WW  None
      WW        ZZ  None
      ZZ        AA  None
      
#test per Store if matching
m = df1.groupby('Store').apply(lambda x: x.isin(x.index.get_level_values(1))).any(axis=1)
df['Prod_Flag'] = np.where(m, 'Y', '')
print (df)
   Store Products located_products Prod_Flag
0     11       AA           AA, DD         Y <- match AA per 11
1     11       DD           AA, CC         Y <- match CC per 11
2     11       CC           WW, ZZ           <- no match
3     12       XX               WW         Y <- match WW per 12
4     12       WW               ZZ         Y <- match ZZ per 12
5     12       ZZ               AA          <- no match
打印(df)
商店产品位于您的产品
0.11 AA,DD
111DD AA,CC
2 11 CC WW,ZZ
3 12 XX WW
4 12 WW ZZ
5 12 ZZ AA
#将第一列转换为列以索引,将第二列转换为多列
df1=df.set_index(['Store','Products'])['located_Products'].str.split('','expand=True)
打印(df1)
0     1
存储产品
11 AA DD
DD AA CC
CC WW ZZ
12 XX WW无
WW ZZ无
ZZ AA无
#如果匹配,则测试每个存储
m=df1.groupby('Store').apply(lambda x:x.isin(x.index.get_level_values(1)).any(axis=1)
df['Prod_Flag']=np.其中(m,'Y','')
打印(df)
商店产品位于产品生产标志处

0 11 AA,DD Y或者,这也可以起作用,但@jezrael的回答非常好

但我的解决方案

import numpy as np
import pandas as pd

s=df['located_products'].str.split(',')
df['loc1']=s.str[0]
df['loc2']=s.str[1]
df['Prod_Flag']=np.where((df['products'].eq(df['loc1'].str.strip(' ')))| 
(df['products'].eq(df['loc2'].str.strip(' '))),"Y"," ")

谢谢你的解决方案。这解决了我在商店层面的问题吗??因为所有商店的“产品”都是一样的。因此,我们必须对每个商店进行比较。问题进行了相应的编辑,以便于理解。请参考@user12345-答案已编辑。