Python Dataframe根据类别中的字符串值列表将列更新为类别名称

Python Dataframe根据类别中的字符串值列表将列更新为类别名称,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有按名称分类的列表,例如: dinning=['CARLS'、'SUBWAY'、'PIZZA'] 银行=['转账','文莫','随用随存'] 如果在另一列中找到任何字符串,我想将一个新列更新为类别名称。在我的另一个问题中,我有以下数据集(银行交易列表示例): 将熊猫作为pd导入 将numpy作为np导入 餐饮=['CARLS'、'SUBWAY'、'PIZZA'] 银行=['转账','文莫','随用随存'] 数据=[ [-68.23,“贝宝转账”], [-12.46,'拉尔夫#0079'],

我有按名称分类的列表,例如:

dinning=['CARLS'、'SUBWAY'、'PIZZA']
银行=['转账','文莫','随用随存']
如果在另一列中找到任何字符串,我想将一个新列更新为类别名称。在我的另一个问题中,我有以下数据集(银行交易列表示例):

将熊猫作为pd导入
将numpy作为np导入
餐饮=['CARLS'、'SUBWAY'、'PIZZA']
银行=['转账','文莫','随用随存']
数据=[
[-68.23,“贝宝转账”],
[-12.46,'拉尔夫#0079'],
[-8.51,‘随用随存’,
[25.34,“VENMO兑现”],
[-2.23,“贝宝转账”],
[-64.29,“贝宝转账”],
[-7.06,“地铁”],
[-7.03,“小卡尔”],
[-2.35,‘壳牌石油’,
[-35.23,‘雪佛龙天然气’]
]
df=pd.DataFrame(数据,列=['amount','details'])
df['category']=np.nan
df
金额明细类别
0-68.23贝宝转账NaN
1-12.46拉尔夫#0079南
2-8.51随用随存
3 25.34文莫兑现NaN
4-2.23贝宝转账
5-64.29贝宝转账
6-7.06地铁站
7-7.03小卡尔南酒店
8-2.35壳牌石油公司
9-35.23雪佛龙天然气公司
如果列表中的字符串在data.details中找到,是否有一种有效的方法可以将category列更新为'dinning'或'bank'

即所需输出:
金额明细类别
0-68.23贝宝转账银行
1-12.46拉尔夫#0079南
2-8.51随用随存银行
3 25.34文莫提款银行
4-2.23贝宝转账银行
5-64.29贝宝转账银行
6-7.06地铁餐厅
7-7.03小卡尔餐厅
8-2.35壳牌石油公司
9-35.23雪佛龙天然气公司

从我前面的问题来看,到目前为止,我假设我需要使用str.extract创建一个新列表。

您可以使用
findall
+
dict
map

sub = {**dict.fromkeys(dining, 'dining'), **dict.fromkeys(bank, 'bank')}
df.details.str.findall('|'.join(sub)).str[0].map(sub)
Out[146]: 
0      bank
1       NaN
2      bank
3      bank
4      bank
5      bank
6    dining
7    dining
8       NaN
9       NaN
Name: details, dtype: object

#df['category'] = df.details.str.findall('|'.join(sub)).str[0].map(sub)
由于我们有多个条件,因此我们可以使用:

dining = '|'.join(dining)
bank = '|'.join(bank)

conditions = [
    df['details'].str.contains(f'({dining})'),
    df['details'].str.contains(f'({bank})')
]

choices = ['dining', 'bank']

df['category'] = np.select(conditions, choices, default=np.NaN)


如此微小的变化。回答得好<代码>子={**dict.fromkeys(dining,'dining'),**dict.fromkeys(bank,'bank')};df.details.str.findall(“|”).join(sub)).str[0].map(sub)
   amount          details category
0  -68.23  PAYPAL TRANSFER     bank
1  -12.46     RALPHS #0079      nan
2   -8.51   SAVE AS YOU GO     bank
3   25.34    VENMO CASHOUT     bank
4   -2.23  PAYPAL TRANSFER     bank
5  -64.29  PAYPAL TRANSFER     bank
6   -7.06           SUBWAY   dining
7   -7.03         CARLS JR   dining
8   -2.35        SHELL OIL      nan
9  -35.23      CHEVRON GAS      nan