在数据框列中找到字典的值并对其进行修改

时间:2018-10-03 21:42:55

标签: python pandas dictionary dataframe any

我现在正在处理DataFrames和Dictionaries,但遇到了问题, 我有一本字典“ 水果

{BN:'Banana', LM:'Lemon', AP:'Apple' ..... etc}

还有一个DataFrame-“ Stock ”:

   Fruit             Price
0  Sweet Mango           1
1  Green Apple           2
2  Few blue Banana       0
3  Black Banana          5

我想做下一件事情: 以此方式将Stock['Fruit']中的所有值替换为Fruits.values(): 如果“水果”中的值出现在Stock['Fruit']行中,则它将通过以下方式替换:

少量蓝色香蕉 ---> 香蕉

黑色香蕉 ---> 香蕉

现在,DataFrame Stock 的外观如下:

   Fruit             Price
0  Sweet Mango           1
1  Green Apple           2
2  Banana                0
3  Banana                5

我找到了不同的代码来替换或检查Dicitionary中的值是否出现在DataFrame中

Stock['Fruit'] = Stock.Fruit.map(Fruits)

if (Fruits.values() in Stock['Fruit'] for item in Stock)

any('Mango' in Stock['Fruit'] for index,item in Stock.iterrows())

但是我找不到任何可以更新DataFrame行的东西

3 个答案:

答案 0 :(得分:2)

IIUC,您可以将apply()与自定义功能一起使用:

import pandas as pd

df = pd.DataFrame([['Sweet Mango', 1],['Green Apple', 2],['Few blue Banana', 0],['Black Banana', 5]],
  columns=['Fruit','Price'])

fruits = {'BN':'Banana', 'LM': 'Lemon', 'AP':'Apple', 'MG': 'Mango'}

def find_category(x):

  return [k for k in fruits.values() if k in x][0]

df['Fruit'] = df['Fruit'].apply(find_category)

收益:

    Fruit  Price
0   Mango      1
1   Apple      2
2  Banana      0
3  Banana      5

答案 1 :(得分:2)

使用字符串方法确定条件并提取所需的值,

pat = r'({})'.format('|'.join(d.values()))
cond = df['Fruit'].str.contains('|'.join(d.values()))
df.loc[cond, 'Fruit'] = df['Fruit'].str.extract((pat), expand = False)

    Fruit       Price
0   Sweet Mango 1
1   Apple       2
2   Banana      0
3   Banana      5

编辑:按照@ user3483203的建议,一旦提取出图案,就可以用原始填充缺失的值。

df['Fruit'] = df['Fruit'].str.extract(pat).fillna(df.Fruit)

答案 2 :(得分:0)

使用答案here的结果,我们创建一个继承defaultdict的新类,并覆盖其__missing__属性以允许将密钥传递给default_factory

from collections import defaultdict
class keydefaultdict(defaultdict):
    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        else:
            ret = self[key] = self.default_factory(key)
            return ret

我们创建了一个初始字典,该字典映射了我们要替换的'Fruits'列中的2个值。

fruit_dict = {'Few blue Banana': 'Banana', 'Black Banana': 'Banana'}

然后,我们使用default_factory的{​​{1}}创建一个新的类实例。也就是说,如果在搜索时找不到密钥,请将密钥作为值输入。

lambda x: x

最后,更新列:

fruit_col_map = keydefaultdict(lambda x: x)
fruit_col_map.update(**fruit_dict)

输出:

df['Fruit'] = df['Fruit'].map(fruit_col_map)
df

与接受的答案相比,它快了6倍以上:

         Fruit  Price
0  Sweet Mango      1
1  Green Apple      2
2       Banana      0
3       Banana      5

结果:

df = pd.DataFrame({
    'Fruit': ['Sweet Mango', 'Green Apple', 'Few blue Banana', 'Black Banana']*1000,
    'Price': [1, 2, 0, 5]*1000
})
%timeit df['Fruit'].map(fruit_col_map)

可接受的答案:

1.03 ms ± 48.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

结果:

pat = r'({})'.format('|'.join(fruit_dict.values()))
%timeit df['Fruit'].str.extract(pat).fillna(df['Fruit'])