有效地替换pandas df

时间:2018-06-01 06:37:45

标签: python pandas loops for-loop replace

我正在尝试使用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个不同的地方效率不高。

是否有更高效的循环每个代码并替换位置信息?

1 个答案:

答案 0 :(得分:0)

我认为需要删除map创建的4Series个字符和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