Python 替换中单元格中的多个值

Python 替换中单元格中的多个值,python,pandas,loops,dictionary,Python,Pandas,Loops,Dictionary,我有一个数据帧,看起来像这样 place type 0 sometown α-RXⅡ;α-R 1 sometown NYC-iA-SV2;NX-SH 其中,列类型具有以分隔的值 我还有一本字典,看起来像这样 place type 0 sometown α-RXⅡ;α-R 1 sometown NYC-iA-SV2;NX-SH {'phone':['NX2-S', “NX2-M”, “NX2

我有一个数据帧,看起来像这样

     place           type
0   sometown    α-RXⅡ;α-R
1   sometown    NYC-iA-SV2;NX-SH

其中,列类型具有以分隔的值

我还有一本字典,看起来像这样

     place           type
0   sometown    α-RXⅡ;α-R
1   sometown    NYC-iA-SV2;NX-SH

{'phone':['NX2-S', “NX2-M”, “NX2-S”, “NX2-M”, “NX2-L”, “纽约国际机场” ... ], ‘UTM’:[‘α’RXⅡ', 'α-R', ...] } 它包含一些类别作为键,类型作为值

我想替换所有被分割的值;根据匹配的值,从dataframe按关键字从categories_dict中框出列类型

所以我想要这样的东西

     place           type
0   sometown    α-RXⅡ;α-R
1   sometown    NYC-iA-SV2;NX-SH

地点类型 0某地UTM,UTM 1某地电话,电话 我是这样做的,但看起来真的不太好

我想知道,如果有更好的方法做到这一点

对于索引,frame.iterrows中的行:df中的所有行 数据=行[1]。拆分;获取行值-拆分 对于数据中的一个_数据:循环行的所有值 对于键,分类项中的val: 如果val中有一个_数据: data.removeone_数据 data.appendkey
您可以先使用列表展平字典交换键,然后在嵌套列表中获取值(如果匹配):

#http://stackoverflow.com/a/31674731/2901002
d = {k: oldk for oldk, oldv in categories_dict.items() for k in oldv}
 
df['type'] = df['type'].apply(lambda x: tuple([d[y] for y in x.split(';') if y in d]))
print (df)
      place            type
0  sometown      (UTM, UTM)
1  sometown  (phone, phone)
如果原始数据不匹配,则会将其添加到元组中,因为dict.get函数在不匹配的情况下具有返回值的第二个参数-因此使用返回的原始值:

print (df)
      place                    type
0  sometown  α-RXⅡ;α-R;another data
1  sometown        NYC-iA-SV2;NX-SH

#http://stackoverflow.com/a/31674731/2901002
d = {k: oldk for oldk, oldv in categories_dict.items() for k in oldv}
 
df['type'] = df['type'].apply(lambda x: tuple([d.get(y, y) for y in x.split(';')]))
print (df)
      place                      type
0  sometown  (UTM, UTM, another data)
1  sometown            (phone, phone)

您可以先使用列表展平字典交换键,然后在嵌套列表中获取值(如果匹配):

#http://stackoverflow.com/a/31674731/2901002
d = {k: oldk for oldk, oldv in categories_dict.items() for k in oldv}
 
df['type'] = df['type'].apply(lambda x: tuple([d[y] for y in x.split(';') if y in d]))
print (df)
      place            type
0  sometown      (UTM, UTM)
1  sometown  (phone, phone)
如果原始数据不匹配,则会将其添加到元组中,因为dict.get函数在不匹配的情况下具有返回值的第二个参数-因此使用返回的原始值:

print (df)
      place                    type
0  sometown  α-RXⅡ;α-R;another data
1  sometown        NYC-iA-SV2;NX-SH

#http://stackoverflow.com/a/31674731/2901002
d = {k: oldk for oldk, oldv in categories_dict.items() for k in oldv}
 
df['type'] = df['type'].apply(lambda x: tuple([d.get(y, y) for y in x.split(';')]))
print (df)
      place                      type
0  sometown  (UTM, UTM, another data)
1  sometown            (phone, phone)

通过创建一个新函数,您可以轻松完成此操作:

def mapping(x):   
    if x in categories_dict['phone']:
        return('phone')
    elif x in categories_dict['UTM']:
        return('UTM')
    else:
        return(i)

df['type'].apply(lambda x:[ mapping(i) for i in x.split(';')]   )


0      [UTM, UTM]
1    [phone, phone]

通过创建一个新函数,您可以轻松完成此操作:

def mapping(x):   
    if x in categories_dict['phone']:
        return('phone')
    elif x in categories_dict['UTM']:
        return('UTM')
    else:
        return(i)

df['type'].apply(lambda x:[ mapping(i) for i in x.split(';')]   )


0      [UTM, UTM]
1    [phone, phone]
尝试将列表中的每个元素转换为一行,并对其进行处理。然后将groupby与aggtuple一起使用以获得结果

样本数据:

data = [{'place': 'sometown', 'type': 'α-RXⅡ;α-R'},
 {'place': 'sometown', 'type': 'NYC-iA-SV2;NX-SH'}]
df = pd.DataFrame(data)
category_dict = {'phone': ['NYC-iA-SV2', 'NX-SH', 'NX2-S', 'NX2-M', 'NX2-L', 'NYC-iA'],
 'UTM': ['α-RXⅡ', 'α-R']}
过程:

# flatten the category_dict 
obj_map = pd.Series(category_dict).explode()
obj_dict = dict(zip(obj_map.values, obj_map.index))

    {'NYC-iA-SV2': 'phone',
     'NX-SH': 'phone',
     'NX2-S': 'phone',
     'NX2-M': 'phone',
     'NX2-L': 'phone',
     'NYC-iA': 'phone',
     'α-RXⅡ': 'UTM',
     'α-R': 'UTM'}

obj_cat = (df['type'].str.split(';')
    .explode()
    .map(obj_dict)
    .groupby(level=0)
    .agg(tuple))

df['obj_cat'] = obj_cat
输出:

print(df)
      place              type         obj_cat
0  sometown         α-RXⅡ;α-R      (UTM, UTM)
1  sometown  NYC-iA-SV2;NX-SH  (phone, phone)
尝试将列表中的每个元素转换为一行,并对其进行处理。然后将groupby与aggtuple一起使用以获得结果

样本数据:

data = [{'place': 'sometown', 'type': 'α-RXⅡ;α-R'},
 {'place': 'sometown', 'type': 'NYC-iA-SV2;NX-SH'}]
df = pd.DataFrame(data)
category_dict = {'phone': ['NYC-iA-SV2', 'NX-SH', 'NX2-S', 'NX2-M', 'NX2-L', 'NYC-iA'],
 'UTM': ['α-RXⅡ', 'α-R']}
过程:

# flatten the category_dict 
obj_map = pd.Series(category_dict).explode()
obj_dict = dict(zip(obj_map.values, obj_map.index))

    {'NYC-iA-SV2': 'phone',
     'NX-SH': 'phone',
     'NX2-S': 'phone',
     'NX2-M': 'phone',
     'NX2-L': 'phone',
     'NYC-iA': 'phone',
     'α-RXⅡ': 'UTM',
     'α-R': 'UTM'}

obj_cat = (df['type'].str.split(';')
    .explode()
    .map(obj_dict)
    .groupby(level=0)
    .agg(tuple))

df['obj_cat'] = obj_cat
输出:

print(df)
      place              type         obj_cat
0  sometown         α-RXⅡ;α-R      (UTM, UTM)
1  sometown  NYC-iA-SV2;NX-SH  (phone, phone)

类型列的值类似于α-RX我在dict中找不到。请提供正确的dict。dict有很多值,所以我不得不缩短它。这只是为了解释。但好的,我会编辑它,你的类型列有α-RX我在dict中找不到。请提供正确的dict。dict有很多值,所以我不得不缩短它。这只是为了解释。但是好的,我要编辑它,谢谢注释,我执行了,但是得到了TypeError:“in”需要字符串作为左操作数,而不是float in f=lambda…@MarcelKopera-如果更改x.split,工作情况如何?;”到strx.split“;”?没有变化。。。同样的错误:-@MarcelKopera-如果只在数据帧上测试前5行,同样的错误?最后一个版本有效!感谢Hanks的评论,我执行了这个命令,但是得到了TypeError:“in”需要字符串作为左操作数,而不是float in f=lambda…@MarcelKopera-如果更改x.split';“如何工作?”到strx.split“;”?没有变化。。。同样的错误:-@MarcelKopera-如果只在数据帧上测试前5行,同样的错误?最后一个版本有效!谢谢