Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何基于python中不同行的字符串形式创建新列_Python_Regex_String_Pandas_String Formatting - Fatal编程技术网

如何基于python中不同行的字符串形式创建新列

如何基于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 我想创建一个新的专栏,用实际的食物类型替换实际

假设我有以下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
我想创建一个新的专栏,用实际的食物类型替换实际的食物:

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'}

用那本字典做点什么?我似乎不明白。谢谢

我的方法是:

  • 反转列表字典,使每个值成为一个键,其各自的键作为字典
  • 将字符串拆分,
    stack
    ing成一个
    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