按源优先级查找替换名称(python)

时间:2017-01-05 09:43:08

标签: python pandas dictionary

我有一个文件,里面有许多不同命名的助记符(“原始助记符”)。我需要将这些命名不好的助记符的名称更改为通用名称(“常规助记符”)。我相信我应该用字典来做这件事,但我不是正面的。

这是一个数据示例(您可以从下面的代码创建数据框):

originalMnemonic = ['ABCGR1','ABCGR2','ABCGR3','ABCGR4','ABCRT1','ABCRT2','ABCRT3','ABCRT4']
generalMnemonic = ['GR','GR','GR','GR','RT','RT','RT','RT']
sourcePriority = [2,3,4,5,1,2,3,4]

curveDf = pd.DataFrame(
    {'originalMnemonic': originalMnemonic,
     'generalMnemonic': generalMnemonic,
     'sourcePriority': sourcePriority
    })

我已将每个“原始助记符”赋予“一般助记符”名称,我还提供了源优先级。

如何使用“常规助记符”名称查找和替换“原始助记符”的名称。按源优先顺序排列。 (即如果存在源prioirty 1,则使用1.如果1不存在则使用源优先级2.)

以下是我想要更改的文件的示例:

curveName = ['ABCGR1', 'ABCGR2', 'ABCGR3', 'ABCGR4', 'ABCRT1', 'ABCRT2', 'ABCRT3', 'ABCRT4']

curveDesc = ['I only want this name to be GR','dont change name','dont change name','dont change name',
            'I only want this name to be RT','dont change name','dont change name','dont change name']

changeDf = pd.DataFrame(
    {'curveName': curveName,
     'curveDesc': curveDesc
    })

“curveName”应从源优先级顺序更改为“curveDF”中的“常规助记符”名称。

这是我想要的输出:(注意ABCGR1如何更改为GR(源优先级为2,ABCRT1已更改为RT(源优先级为1)

originalMnemonic = ['GR','ABCGR2','ABCGR3','ABCGR4','RT','ABCRT2','ABCRT3','ABCRT4']
generalMnemonic = ['GR','GR','GR','GR','RT','RT','RT','RT']
sourcePriority = [2,3,4,5,1,2,3,4]

outputDf = pd.DataFrame(
    {'originalMnemonic': originalMnemonic,
     'generalMnemonic': generalMnemonic,
     'sourcePriority': sourcePriority
    })
outputDf

任何有助于我走上正轨的帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

<强>更新

来源DF:

In [141]: curveDf
Out[141]:
  generalMnemonic originalMnemonic  sourcePriority
0              GR           ABCGR1               2
1              GR           ABCGR2               3
2              GR           ABCGR3               4
3              GR           ABCGR4               5
4              RT           ABCRT1               1
5              RT           ABCRT2               2
6              RT           ABCRT3               3
7              RT           ABCRT4               4

<强>解决方案:

In [142]: curveDf.loc[curveDf.groupby('generalMnemonic', as_index=0) \
                             .sourcePriority.idxmin(), \
                      'originalMnemonic'] =  curveDf.generalMnemonic

In [143]: curveDf
Out[143]:
  generalMnemonic originalMnemonic  sourcePriority
0              GR               GR               2
1              GR           ABCGR2               3
2              GR           ABCGR3               4
3              GR           ABCGR4               5
4              RT               RT               1
5              RT           ABCRT2               2
6              RT           ABCRT3               3
7              RT           ABCRT4               4

说明:

In [140]: curveDf.groupby('generalMnemonic', as_index=0).sourcePriority.idxmin()
Out[140]:
0    0
1    4
dtype: int64

OLD回答:

IIUC你可以这样做:

In [11]: curveDf.loc[curveDf.sourcePriority==1, 'originalMnemonic'] = curveDf.generalMnemonic

In [12]: curveDf
Out[12]:
  generalMnemonic originalMnemonic  sourcePriority
0              GR               GR               1
1              GR           ABCGR2               2
2              GR           ABCGR3               3
3              GR           ABCGR4               4
4              RT               RT               1
5              RT           ABCRT2               2
6              RT           ABCRT3               3
7              RT           ABCRT4               4