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行,同样的错误?最后一个版本有效!谢谢