有条件地填充另一个熊猫df的数据?

时间:2020-05-12 11:16:52

标签: python-3.x pandas

所以我有一个df1,其“名称”列中带有字符串对象。

然后有一个带有“类别”和“正则表达式”的df2。 df2.Regex保存正则表达式。

我需要做的是

  • 在df1中添加“类别”列;
  • 使用df2填充它。当正则表达式返回匹配项时,类别字符串将被填充。

我是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

1 个答案:

答案 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