所以我有一个df1,其“名称”列中带有字符串对象。
然后有一个带有“类别”和“正则表达式”的df2。 df2.Regex保存正则表达式。
我需要做的是
我是Pandas的新手,我想我可能是从完全错误的角度来考虑这个问题。随意把我的方法扔进垃圾箱,让我走上更好的路;-)
import pandas as pd
import numpy as np
flowers = {'Name':['Blue rose', 'Red rose', 'White rose', 'Green tulip', 'Rosy tulip', 'Yellow tulip']}
types = {'Categories':['Rose', 'Tulip'], 'Regex':[r'rose', r'tulip']
df1 = pd.DataFrame(flowers)
df2 = pd.DataFrame(types)
df1['Category'] = ???
我尝试了随机的事情,但是没有一个产生任何好的结果...
例如:
for x in df2.values:
df['Portfolio'] = np.where(df.INSTRUMENT_NAME.str.contains(x[1]), x[0], 0)
不起作用,因为for循环重写了先前迭代添加的所有数据。同样,np.where不允许在不满足其条件时简单地通过(或者至少我不知道如何使其工作)
很明显,预期结果是:
df1
i Name Category
0 Blue rose Rose
1 Red rose Rose
2 White rose Rose
3 Green tulip Tulip
4 Rosy tulip Tulip
5 Yellow tulip Tulip
答案 0 :(得分:1)
在您的解决方案中,可以使用DataFrame.loc
为条件设置匹配行的设置值:
for cat, reg in df2.values:
mask = df1['Name'].str.contains(reg)
df1.loc[mask, 'Category'] = cat
print (df1)
Name Category
0 Blue rose Rose
1 Red rose Rose
2 White rose Rose
3 Green tulip Tulip
4 Rosy tulip Tulip
5 Yellow tulip Tulip
或者可以将Series.str.extract
与所有Regex
的值一起使用,然后再使用Series.map
:
s = df2.set_index('Regex')['Categories']
df1['Category'] = df1['Name'].str.extract(f'({"|".join(s.index)})', expand=False).map(s)
print (df1)
Name Category
0 Blue rose Rose
1 Red rose Rose
2 White rose Rose
3 Green tulip Tulip
4 Rosy tulip Tulip
5 Yellow tulip Tulip