我有以下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
通常,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
的重复组合,以便我可以知道哪个组合是第一次出现,哪个是第二次出现,依此类推。 ..所以预期的输出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
答案 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
答案 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