我喜欢将字典键中的部分字符串映射到这样的系列:
pod update
现在我想将d键映射到n列以匹配部分字符串并设置倍数。我通过一个丑陋的循环实现了这个目标:
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}
我有更好的,更多的Pandasly方式吗?谢谢!
答案 0 :(得分:4)
这就是我想出来的
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)
print 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'(Croatia|Italy|Germany)'
,这是一个正则表达式,与'|'
中由()
分隔的所有选项相匹配。在str.extract
方法中使用时,它会返回匹配的国家/地区。然后运行apply
以获取字典值。并非所有系列值都会与字典中的键匹配,因此我们必须dropna
然后再fillna
。
答案 1 :(得分:3)
df['multiple'] = df['n'].str.extract('('+'|'.join(list(d))+')').map(d).fillna(1)
print df
n A multiple
0 abcde Germany fffe 7 0.5
1 aaaa Norway bbbb 0 1.0
2 tttt Sweden 3 1.0
3 Croatia dfdfdf 8 1.5
4 Italy sfsd 4 1.5