2013-10-13 79 views
1

添加參考我有一個包含在一定的列中的某一值的多次出現一個數據幀。我想通過在新列中添加某種引用來設置這些值。例如,假設我有一個ID列一個數據幀:計數值,並在新數據幀列

  ID 
7  2035200584 
8  2035200584 
9  2035200584 
31 2038128459 
32 2038128459 
33 2038128459 
42 2053561908 
43 2053561908 
44 2053561908 

,我想創建一個新的列,說「newid的」,這將是這個樣子:

  ID 
7  2035200584_1 
8  2035200584_2 
9  2035200584_3 
31 2038128459_1 
32 2038128459_2 
33 2038128459_3 
42 2053561908_1 
43 2053561908_2 
44 2053561908_3 

IV」 e試圖使用groupby機制,但沒有成功。使用簡單的應用機制是好的,但似乎有點麻煩(我需要保持包含每個ID的外觀計數器的字典)

有沒有一個簡單而有效的方法來做到這一點,我失蹤?

+0

@DSM:我要刪除我的解決方案,因爲你似乎工作比我好顯著。你能否取消刪除你的? – unutbu

回答

3

這裏的DSM解決方案的一個微小的變化:

import pandas as pd 
import io 

content = io.BytesIO('''index ID 
7  2035200584 
8  2035200584 
9  2035200584 
31 2038128459 
32 2038128459 
33 2038128459 
42 2053561908 
43 2053561908 
44 2053561908''') 

df = pd.read_table(content, sep='\s+', header=0) 

df['ID'] = df.groupby('ID')['ID'].transform(
    lambda x: map('{:.0f}_{:.0f}'.format, x, x.rank('first'))) 

print(df) 

產生

index   ID 
0  7 2035200584_1 
1  8 2035200584_2 
2  9 2035200584_3 
3  31 2038128459_1 
4  32 2038128459_2 
5  33 2038128459_3 
6  42 2053561908_1 
7  43 2053561908_2 
8  44 2053561908_3 
+0

你能解釋什麼在這裏?因爲我試圖用GROUPBY和應用,什麼我回來是與ID爲指數和修改的ID爲每個索引列表的一個系列。在這裏引發了什麼?以上代碼的自然語言翻譯是什麼? – idoda

+0

'apply'和'transform'做類似的事情。 'apply'是一個複雜的野獸,因爲它的行爲有所不同,這取決於函數返回的對象的類型。我沒有試圖記住[支配這種行爲的規則(https://github.com/pydata/pandas/blob/master/pandas/core/groupby.py#L330),我只是嘗試一些合理的變化,直到我找到了一個有效的工具。在這種情況下,因爲我知道是爲改變一個系列,以等長*的另一系列*變換,我試着變換。 – unutbu

+1

爲了更好地理解我的解決方案是幹什麼的,我建議首先看'df.groupby( 'ID') 'ID']變換(拉姆達X:X)''然後df.groupby( 'ID')」 ID ']變換。(拉姆達X:x.rank(' 第一 '))'和'地圖('{} _ {}」。格式,[1,2,3], 'ABC')'。如果你理解這些部分,那麼我懷疑你會理解我的解決方案,至少在我理解的水平上。 – unutbu