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