2016-05-28 2 views
4

У меня есть следующие Dataframe:Python Панды Определение дублируется строк с дополнительной колонке

df 
Out[23]: 
    PplNum RoomNum Value 
0  1  0 265 
1  1  12 170 
2  2  0 297 
3  2  12  85 
4  2  0  41 
5  2  12 144 

Вообще PplNum и RoomNum генерируется, как это, и он всегда будет иметь следующий формат:

for ppl in [1,2,2]: 
    for room in [0, 12]: 
     print(ppl, room) 

1 0 
1 12 
2 0 
2 12 
2 0 
2 12 

Но теперь то, что я хотел бы достичь, - отметить эти дубликаты комбинаций PplNum и RoomNum, чтобы я мог знать, какие комбинации являются первым вхождением, которые являются вторыми o ccurrence и так далее ... Так что ожидаемый выход Dataframe будет выглядеть следующим образом:

PplNum RoomNum Value C 
0  1  0 265 1 
1  1  12 170 1 
2  2  0 297 1 
3  2  12  85 1 
4  2  0  41 2 
5  2  12 144 2 

ответ

4

вы можете сделать это с помощью groupby() вместе с cumcount() функции:

In [102]: df['C'] = df.groupby(['PplNum','RoomNum']).cumcount() + 1 

In [103]: df 
Out[103]: 
    PplNum RoomNum Value C 
0  1  0 265 1 
1  1  12 170 1 
2  2  0 297 1 
3  2  12  85 1 
4  2  0  41 2 
5  2  12 144 2 

Объяснение:

In [101]: df.groupby(['PplNum','RoomNum']).cumcount() + 1 
Out[101]: 
0 1 
1 1 
2 1 
3 1 
4 2 
5 2 
dtype: int64 

Group-By examples

+1

WOW, здорово решить только с одной строки кода! – 2342G456DI8

+0

@MaxU, Thx для вашего asnwer, не могли бы вы объяснить, как это работает, 'groupby' и' cumcount'? –

+2

@ J.J.Marko, я добавил ссылки на соответствующие документы и примеры использования 'groupby' - я думаю, что это лучшее объяснение – MaxU

2

Это мое приложение плотва с рекурсивной функцией:

dfnondup = df.drop_duplicates(['PplNum', 'RoomNum']) 


def rename_dup(df): 
    def rename_dup(df, c, dfnew): 
     dfnondup = df.drop_duplicates(['PplNum', 'RoomNum']) 
     dfnondup['C'] = pd.Series([c] * len(dfnondup), index=dfnondup.index) 
     dfnew = pd.concat([dfnew, dfnondup], axis=0) 
     c += 1 
     dfdup = df[df.duplicated(['PplNum', 'RoomNum'])] 
     if dfdup.empty: 
      return dfnew, c 
     else: 
      return rename_dup(dfdup, c, dfnew) 

    return rename_dup(df, 1, pd.DataFrame()) 


dfnew, c = rename_dup(df) 

Результат dfnew будет

dfnew 
Out[28]: 
    PplNum RoomNum Value C 
0  1  0 265 1 
1  1  12 170 1 
2  2  0 297 1 
3  2  12  85 1 
4  2  0  41 2 
5  2  12 144 2 
+0

выглядит так сложно. THX в любом случае! –