2016-03-01 99 views
2

我有一个DataFrame,其中列值的组合标识唯一地址(A,B,C)。我想识别所有这样的行并为它们分配一个唯一的标识符,以便每个地址增加一个。Pandas DataFrame Groupby获取唯一行条件,并通过增加值来识别组数最多为组数

例如

A B C D E 
0 1 1 0 1 
0 1 2 0 1 
0 1 1 1 1 
0 1 3 0 1 
0 1 2 1 0 
0 1 1 2 1 

我想生成以下

A B C D E ID 
0 1 1 0 1 0 
0 1 2 0 1 1 
0 1 1 1 1 0 
0 1 3 0 1 2 
0 1 2 1 0 1 
0 1 1 2 1 0 

我试过如下:

id = 0 
def set_id(df): 
    global id 
    df['ID'] = id 
    id += 1 


df.groupby(['A','B','C']).transform(set_id) 

这将返回NULL数据框......这绝对是不是做它的方式..我是熊猫新手。以上应该实际使用df[['A','B','C']].drop_duplicates()来获取所有唯一值 谢谢。

+1

的可能的复制[获取组ID回大熊猫数据框(http://stackoverflow.com/questions/15072626/get-group- id-back-into-pandas-dataframe) – maxymoo

回答

1

我想这是你所需要的:

df2 = df[['A','B','C']].drop_duplicates() #get unique values of ABC 
df2 = df2.reset_index(drop = True).reset_index() #reset index to create a column named index 
df2=df2.rename(columns = {'index':'ID'}) #rename index to ID 
df = pd.merge(df,df2,on = ['A','B','C'],how = 'left') #append ID column with merge 
+0

这按预期工作。谢谢。 – fulatoro

0
# Create tuple triplet using values from columns A, B & C. 
df['key'] = [triplet for triplet in zip(*[df[col].values.tolist() for col in ['A', 'B', 'C']])] 

# Sort dataframe on new `key` column. 
df.sort_values('key', inplace=True) 

# Use `groupby` to keep running total of changes in key value. 
df['ID'] = (df['key'] != df['key'].shift()).cumsum() - 1 

# Clean up. 
del df['key'] 
df.sort_index(inplace=True) 

>>> df 
    A B C D E ID 
0 0 1 1 0 1 0 
1 0 1 2 0 1 1 
2 0 1 1 1 1 0 
3 0 1 3 0 1 2 
4 0 1 2 1 0 1 
5 0 1 1 2 1 0