2016-08-04 245 views
2

說我有一個熊貓數據幀像這樣:添加UUID對大熊貓DF

df = pd.DataFrame({'Name': ['John Doe', 'Jane Smith', 'John Doe', 'Jane Smith','Jack Dawson','John Doe']}) 
df: 
     Name 
    0 John Doe 
    1 Jane Smith 
    2 John Doe 
    3 Jane Smith 
    4 Jack Dawson 
    5 John Doe 

而且我想與有相同名稱是否相同的UUID添加一列。例如,上述數據幀應該成爲:

df: 
      Name  UUID 
     0 John Doe 6d07cb5f-7faa-4893-9bad-d85d3c192f52 
     1 Jane Smith a709bd1a-5f98-4d29-81a8-09de6e675b56 
     2 John Doe 6d07cb5f-7faa-4893-9bad-d85d3c192f52 
     3 Jane Smith a709bd1a-5f98-4d29-81a8-09de6e675b56 
     4 Jack Dawson 6a495c95-dd68-4a7c-8109-43c2e32d5d42 
     5 John Doe 6d07cb5f-7faa-4893-9bad-d85d3c192f52 

的UUID的應從uuid.uuid4()函數來生成。

我目前的想法是使用groupby(「Name」)。cumcount()來標識哪些行具有相同的名稱和哪些行是不同的。然後,我將創建一個字典,其中包含cumcount的一個關鍵字和一個uuid的值,並用它來添加uuids到DF。

雖然這將工作,我想知道是否有一個更有效的方法來做到這一點?

回答

3

這個怎麼樣

names = df['Name'].unique() 
for name in names: 
    df.loc[df['Name'] == name, 'UUID'] = uuid.uuid4() 

可以縮短到

for name in df['Name'].unique(): 
    df.loc[df['Name'] == name, 'UUID'] = uuid.uuid4() 
+0

精美的作品。 – unpairestgood

1

分組數據幀和應用uuid.uuid4會比通過組循環更有效。既然你想保持你的數據框的原始形狀,你應該使用pandas函數transform

使用您的示例數據框,我們將添加一列以便讓系列應用transform。由於uuid.uuid4沒有任何參數,因此列的內容並不重要。

df = pd.DataFrame({'Name': ['John Doe', 'Jane Smith', 'John Doe', 'Jane Smith','Jack Dawson','John Doe']}) 
df.loc[:, "UUID"] = 1 

現在使用transform

import uuid 
df.loc[:, "UUID"] = df.groupby("Name").UUID.transform(lambda g: uuid.uuid4()) 

+----+--------------+--------------------------------------+ 
| | Name  |     UUID     | 
+----+--------------+--------------------------------------+ 
| 0 | John Doe  | c032c629-b565-4903-be5c-81bf05804717 | 
| 1 | Jane Smith | a5434e69-bd1c-4d29-8b14-3743c06e1941 | 
| 2 | John Doe  | c032c629-b565-4903-be5c-81bf05804717 | 
| 3 | Jane Smith | a5434e69-bd1c-4d29-8b14-3743c06e1941 | 
| 4 | Jack Dawson | 6b843d0f-ba3a-4880-8a84-d98c4af09cc3 | 
| 5 | John Doe  | c032c629-b565-4903-be5c-81bf05804717 | 
+----+--------------+--------------------------------------+ 

uuid.uuid4將被調用多次有不同的組