映射str.contains跨越pandas DataFrame

Mat*_* W. 5 python dictionary apply dataframe pandas

初学者与python - 我正在寻找创建字符串的字典映射,以及相关的值.我有一个数据框,并希望创建一个新列,如果字符串匹配,它将列标记为x.

df = pd.DataFrame({'comp':['dell notebook', 'dell notebook S3', 'dell notepad', 'apple ipad', 'apple ipad2', 'acer chromebook', 'acer chromebookx', 'mac air', 'mac pro', 'lenovo x4'],
              'price':range(10)})
Run Code Online (Sandbox Code Playgroud)

例如,我想采取上述内容df并创建一个新列df['company']并将其设置为字符串映射.

我在考虑做类似的事情

product_map = {'dell':'Dell Inc.',
               'apple':'Apple Inc.',
               'acer': 'Acer Inc.',
               'mac': 'Apple Inc.',
               'lenovo': 'Dell Inc.'}
Run Code Online (Sandbox Code Playgroud)

然后我想迭代它来检查df.comp列,看看每个条目是否包含其中一个字符串,并将df.company列设置为字典中的值.

不知道如何正确地做到这一点.

aqu*_*lah 6

有很多方法可以做到这一点.一种方法是:

def like_function(x):
    group = "unknown"
    for key in product_map:
        if key in x:
            group = product_map[key]
            break
    return group

df['company'] = df.comp.apply(like_function)
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 5

这是一种有趣的方法,特别是如果您正在学习 python。您可以子类化dict并覆盖__getitem__以查找部分字符串。

class dict_partial(dict):
    def __getitem__(self, value):
        for k in self.keys():
            if k in value:
                return self.get(k)
        else:
            return self.get(None)

product_map = dict_partial({'dell':'Dell Inc.', 'apple':'Apple Inc.',
                            'acer': 'Acer Inc.', 'mac': 'Apple Inc.',
                            'lenovo': 'Dell Inc.'})

df['company'] = df['comp'].apply(lambda x: product_map[x])

               comp  price     company
# 0     dell notebook      0   Dell Inc.
# 1  dell notebook S3      1   Dell Inc.
# 2      dell notepad      2   Dell Inc.
# 3        apple ipad      3  Apple Inc.
# 4       apple ipad2      4  Apple Inc.
# 5   acer chromebook      5   Acer Inc.
# 6  acer chromebookx      6   Acer Inc.
# 7           mac air      7  Apple Inc.
# 8           mac pro      8  Apple Inc.
# 9         lenovo x4      9   Dell Inc.
Run Code Online (Sandbox Code Playgroud)

我对这种方法的唯一烦恼是子类化不会与语法同时dict覆盖。如果可能的话,我们可以摆脱并使用. 对此似乎没有明显的解决方案。dict.get[]lambdadf['comp'].map(product_map.get)