2017-01-05 51 views
1

我有一個文件有很多不同的命名不當的助記符(「原始助記符」)。我需要將這些命名不當的助記符的名稱更改爲通用名稱(「通用助記符」)。我相信我應該用字典來做這件事,但我不積極。查找替換名稱按源優先級(python)

這裏是數據的一個例子(你可以從下面的代碼創建一個數據幀):

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 

任何幫助,讓我在正確的軌道理解

+0

可能喲你發佈你想要的(結果)數據集? – MaxU

+0

我已經添加了所需的輸出,並更改了一些代碼以使其更有意義。謝謝。 – brandog

回答

1

UPDATE:

源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 
+0

謝謝,那是我在我的問題中尋找的輸出,(但是如果我沒有sourcePriority 1,會發生什麼?它不會移動到2,然後是3,然後是4)。我想我需要改述我的問題。 – brandog

+0

@brandog,如果你只是簡單地發佈你的輸入和想要的數據集並做一個簡短的解釋,那麼它就會更加清晰...... – MaxU

+0

是的,我明白了。我只是試圖簡化它,並在小部分做到這一點。我的問題更加複雜,我試圖通過源優先級創建名稱表,我使用「lasio」包輸入.las文件,然後收集所有助記符(我已經參與了這一步)。然後,我需要採取所有我給出「通用名稱」的助記符,並在.las文件中查找/替換「原始助記符」。我無法簡化所需的步驟。因此我的問題很糟糕。 – brandog