Reputation:
I have pandas dataframe as follows:
user id
1 2
1 2
1 2
1 3
1 3
i want to group by values like this: (1,1,1,2),(1,1,3)
I am using this and it is giving unique values of one column only
pd.unique(df[['id']].values.ravel())
but i want to groupby values with unique of id column using pandas.
Upvotes: 2
Views: 440
Reputation: 32095
One way, seems self-explanatory:
df = df.sort_values(['user', 'id'])
df['groups'] = (df.id!=df.id.shift()).cumsum() # pattern to number groups
df
Out[26]:
user id groups
0 1 2 1
1 1 2 1
2 1 2 1
3 1 3 2
4 1 3 2
df.id = df.id.drop_duplicates('last').reindex_like(df)
df
Out[28]:
user id groups
0 1 NaN 1
1 1 NaN 1
2 1 2.0 1
3 1 NaN 2
4 1 3.0 2
df.set_index('groups').stack()
Out[30]:
groups
1 user 1.0
user 1.0
user 1.0
id 2.0
2 user 1.0
user 1.0
id 3.0
dtype: float64
df.groupby(level=0).apply(tuple)
Out[36]:
groups
1 (1.0, 1.0, 1.0, 2.0)
2 (1.0, 1.0, 3.0)
dtype: object
Upvotes: 1