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-答案已编辑。