【问题标题】:Map partial string from dictionary in Pandas(again)从 Pandas 中的字典映射部分字符串(再次)
【发布时间】:2020-10-25 16:49:18
【问题描述】:

这是对上一篇帖子Map partial string from dictionary in Pandas的跟进

我稍微修改了映射字典

import pandas as pd
import numpy as np

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'])

d = {'Germany':0.5, 'Croatia':1.5, 'Italy':1.5, 'Ital':1, 'German':0.9}

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

print(df)

得到的输出:

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

预期:

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

关于如何获得预期输出的建议将非常有帮助。

【问题讨论】:

    标签: python-3.x pandas dictionary mapping


    【解决方案1】:

    这是一种方法(类似于链接的帖子),它提取字典键中的单词,然后使用 series.map 然后将 fillna1 映射值,其中没有匹配项:

    pat = r'\b(?:{})\b'.format('|'.join(d.keys()))
    df['multiple'] = df['n'].str.extract('('+pat+')',expand=False).map(d).fillna(1)
    

    print(df)
                        n  A  multiple
    0  abcde Germany fffe  5       0.5
    1    aaaa Norway bbbb  4       1.0
    2         tttt Sweden  1       1.0
    3      Croatia dfdfdf  8       1.5
    4          Italy sfsd  0       1.5
    

    【讨论】:

    • 您能否解释一下expand 的工作原理以及正则表达式的工作原理?
    • @Natasha expand=False 在模式返回 1 组时返回一个序列而不是数据帧,然后我们可以利用 series.map 与字典,|.join(d.keys() 返回字典中由 @ 连接的键987654331@,用于按词边界提取全匹配词:r'\b',模式详情可以参考docs
    • pat 的预期输出是\b(?:Germany|Croatia|Italy|Ital|German)\b ?
    • @Natasha ''\\b(?:Germany|Croatia|Italy|Ital|German)\\b'', r 用于转义`\`
    猜你喜欢
    • 2016-09-19
    • 2012-04-26
    • 2015-11-18
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2019-07-25
    • 2021-01-18
    • 2011-01-18
    相关资源
    最近更新 更多