如何基于python中不同行的字符串形式创建新列
假设我有以下df:如何基于python中不同行的字符串形式创建新列,python,regex,string,pandas,string-formatting,Python,Regex,String,Pandas,String Formatting,假设我有以下df: test = pd.DataFrame({'Food': ['Apple Cake', 'Orange Tomato', 'Brocolli Apple', 'Cake Orange', 'Tomato Apple']}) test Food 0 Apple Cake 1 Orange Tomato 2 Brocolli Apple 3 Cake Orange 4 Tomato Apple 我想创建一个新的专栏,用实际的食物类型替换实际
test = pd.DataFrame({'Food': ['Apple Cake', 'Orange Tomato', 'Brocolli Apple', 'Cake Orange', 'Tomato Apple']})
test
Food
0 Apple Cake
1 Orange Tomato
2 Brocolli Apple
3 Cake Orange
4 Tomato Apple
我想创建一个新的专栏,用实际的食物类型替换实际的食物:
test1 = pd.DataFrame({'Food': ['Apple Cake', 'Orange Tomato', 'Brocolli Apple', 'Cake Orange', 'Tomato Apple'], 'Type' : ['Fruit Dessert', 'Fruit Veggie', 'Veggie Fruit', 'Dessert Fruit', 'Veggie Fruit']})
test1
Food Type
0 Apple Cake Fruit Dessert
1 Orange Tomato Fruit Veggie
2 Brocolli Apple Veggie Fruit
3 Cake Orange Dessert Fruit
4 Tomato Apple Veggie Fruit
我该怎么办?我能为以下内容编一本词典吗
{'Fruit' : ['Apple', 'Orange'], 'Veggies': ['Brocolli', 'Tomato'], 'Dessert': 'Cake'}
用那本字典做点什么?我似乎不明白。谢谢 我的方法是:
- 反转列表字典,使每个值成为一个键,其各自的键作为字典
- 将字符串拆分,
ing成一个stack
,映射到获得的字典,pd.Series
第一级索引和groupby
返回连接
我认为你不可能一次就做到。。。但您可以通过以下几步完成:
test=pd.DataFrame({'Food':['Apple-Cake'、'Orange-Tomato'、'Brocolli-Apple'、'Cake-Orange'、'Tomato-Apple']})
dict={‘水果’:[r‘苹果’、[r‘橘子’]、‘蔬菜’:[r‘花椰菜’、[r‘西红柿’]、‘甜点’:[r‘蛋糕’}
测试['Type']=测试['Food']
对于dict.keys()中的k:
测试['Type']=测试['Type'].替换(regex=dict[k],value=k)
测试
很好的一个,我在反转dict时遇到了问题,但有几乎相同的解决方案@OP,我会考虑使用一个单独的案例来解释更好的字符串匹配。DF[ [食物] ]=DF[食物]。STRO.LULVER()是正确的,不是吗?好主意,谢谢!是的。很高兴这有帮助:)@bismo@yatu我问了一个新问题。谢谢回答:)@bismo别忘了你可以投票并接受答案。看,谢谢!这是一个广泛的问题。您需要以某种方式存储每个项目的类别映射。但是,这也可能是复杂的。例如,您需要存储不区分大小写的项目。你需要有一种
模糊匹配
,比如Aple
也应该映射到Apple
等等。你需要提供更多的细节。我处理的数据拼写正确。我只想映射一列的值,并创建一个新列,用其类别替换该值。另一个例子是拥有大陆等的国家
d = {'Fruit' :['Apple', 'Orange'], 'Veggies':['Brocolli', 'Tomato'], 'Dessert': 'Cake'}
d_inv = {i: k for k,v in d.items() for i in (v if isinstance(v, list) else [v])}
# {'Apple': 'Fruit', 'Orange': 'Fruit', 'Brocolli': 'Veggies', 'Tomato':
# 'Veggies', 'Cake': 'Dessert'}
test['type'] = (test.Food.str.split(expand=True)
.stack()
.map(d_inv)
.groupby(level=0)
.agg(' '.join))
print(test)
Food type
0 Apple Cake Fruit Dessert
1 Orange Tomato Fruit Veggies
2 Brocolli Apple Veggies Fruit
3 Cake Orange Dessert Fruit
4 Tomato Apple Veggies Fruit
Food Type
0 Apple Cake Fruit Dessert
1 Orange Tomato Fruit Veggie
2 Brocolli Apple Veggie Fruit
3 Cake Orange Dessert Fruit
4 Tomato Apple Veggie Fruit