Python Pandas使用Additional Column标识重复的行

时间:2016-05-28 09:53:08

标签: python pandas dataframe

我有以下Dataframe

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

通常,PplNumRoomNum会像这样生成,并且始终遵循以下格式:

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

但是现在我想要实现的是标记PplNumRoomNum的重复组合,以便我可以知道哪个组合是第一次出现,哪个是第二次出现,依此类推。 ..所以预期的输出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

2 个答案:

答案 0 :(得分: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 :(得分: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