【问题标题】:Map partial string from dictionary in Pandas从 Pandas 中的字典映射部分字符串
【发布时间】:2016-09-19 05:27:48
【问题描述】:

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

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

我有更好、更 Pandasly 的方式吗?谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是我想出来的

    解决方案

    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'(Croatia|Italy|Germany)',它是一个正则表达式,匹配() 中由'|' 分隔的任何选项。在str.extract 方法中使用时,它返回匹配的国家/地区。然后运行apply 以获取字典值。并非所有系列值都将与字典中的键匹配,因此我们必须先dropna,然后再fillna

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 2012-04-26
        • 2015-11-18
        • 2019-10-01
        • 1970-01-01
        • 2019-07-25
        • 2021-01-18
        • 2011-01-18
        • 1970-01-01
        相关资源
        最近更新 更多