python – 从Pandas中的字典映射部分字符串

我喜欢将字典键中的部分字符串映射到像这样的系列:

df = pd.DataFrame(np.random.randint(0,10,size=(5, 1)), columns=list('A'))
df.insert(0, 'n', ['abcde Germany fffe','aaaa Norway bbbb',
                   'tttt Sweden','Croatia dfdfdf','Italy sfsd'])

>>> df

    n                   A
0   abcde Germany fffe  2
1   aaaa Norway bbbb    1
2   tttt Sweden         4
3   Croatia dfdfdf      1
4   Italy sfsd          2

d = {'Germany':0.5, 'Croatia':1.5, 'Italy':1.5}

现在我喜欢将d键映射到n列以匹配部分字符串并设置倍数.我通过一个丑陋的循环实现了这一点:

df['multiple'] = 1
for k, v in d.iteritems():
    df['multiple'] = np.where(df['n'].str.contains(k), v, df['multiple'])

>>> df

    n                   A   multiple
0   abcde Germany fffe  2   0.5
1   aaaa Norway bbbb    1   1.0
2   tttt Sweden         4   1.0
3   Croatia dfdfdf      1   1.5
4   Italy sfsd          2   1.5

我有更好的,更多的熊猫方式吗?谢谢!

最佳答案 这就是我提出的

pat = r'({})'.format('|'.join(d.keys()))
extracted = df.n.str.extract(pat, expand=False).dropna()

df['multiple'] = extracted.apply(lambda x: d[x]).reindex(df.index).fillna(1)

示范

打印df

                    n  A  multiple
0  abcde Germany fffe  5       0.5
1    aaaa Norway bbbb  3       1.0
2         tttt Sweden  7       1.0
3      Croatia dfdfdf  5       1.5
4          Italy sfsd  9       1.5

说明

pat看起来像r'(克罗地亚|意大利|德国)’这是一个正则表达式,匹配任何由“|”分隔的选项内 ().在str.extract方法中使用时,它返回匹配的国家/地区.然后运行一个apply来获取字典值.并非所有系列值都会与dict中的键匹配,因此我们必须稍后再使用fillna.

点赞