我现在正在处理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行的东西
答案 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'])