我正在尝试使用pandas df
中的有意义信息有效地替换某些值。以下是我正在使用的df's
的示例。
此df
是有意义信息的示例。每个3字母代码等于实际位置。例如。 ABC = Home
import pandas as pd
m = pd.DataFrame({
'Place' : ['Home','Away'],
'Code' : ['ABC','DEF']})
输出:
Code Place
0 ABC Home
1 DEF Away
我想将值Column D
替换为地点信息。因此Home
会取代ABC
。此代码后还有其他项目,但我可以轻松删除它们。
d = pd.DataFrame({
'C' : ['08:00:00','XX','08:10:00','XX','08:41:42','XX','08:50:00','XX', '09:00:00'],
'D' : ['ABC-Thu','','ABC-Thu','','DEF-Thu','','ABC-Thu','','DEF-Thu'],
'E' : ['Num:','','Num:','','Num:','','Num:','','Num:'],
'F' : ['1','','1','','1','','1','','1'],
'A' : ['A','','A','','A','','A','','A'],
'B' : ['Stop','','Res','','Stop','','Start','','Res']
})
目前我正在手动执行此操作,
#remove last 4 items
d['D'] = [x[:-4] for x in d['D']]
#replace with appropriate place
d['D'] = d['D'].replace(['ABC'], 'Home')
d['D'] = d['D'].replace(['DEF'], 'Away')
输出:
A B C D E F
0 A Stop 08:00:00 Home Num: 1
1 XX
2 A Res 08:10:00 Home Num: 1
3 XX
4 A Stop 08:41:42 Away Num: 1
5 XX
6 A Start 08:50:00 Home Num: 1
7 XX
8 A Res 09:00:00 Away Num: 1
但是需要更换的不同地方的数量可以达到40-50。代码也可以随每个数据集而变化。因此ABC
可能一天Home
而下一天Pool
。你可以想象,每天改变40-50个不同的地方效率不高。
是否有更高效的循环每个代码并替换位置信息?
答案 0 :(得分:0)
我认为需要删除map
创建的4
前Series
个字符和set_index
,最后添加fillna
以将非匹配值替换为原始值D
:
d['D'] = d['D'].str[:-4].map(m.set_index('Code')['Place']).fillna(d['D'])
print (d)
A B C D E F
0 A Stop 08:00:00 Home Num: 1
1 XX
2 A Res 08:10:00 Home Num: 1
3 XX
4 A Stop 08:41:42 Away Num: 1
5 XX
6 A Start 08:50:00 Home Num: 1
7 XX
8 A Res 09:00:00 Away Num: 1
<强>详情:
print (d['D'].str[:-4])
0 ABC
1
2 ABC
3
4 DEF
5
6 ABC
7
8 DEF
Name: D, dtype: object
print (m.set_index('Code')['Place'])
Code
ABC Home
DEF Away
Name: Place, dtype: object