I have a dataframe which looks like this
A | B | C | Category | Value |
---|---|---|---|---|
1 | A | Prime | Unique | 0 |
2 | A | Prime | One | Initials |
1 | A | Prime | Two | Seconds |
2 | B | Prime | Unique | 1 |
2 | B | Prime | One | Firsts |
I want to create a new dataframe where I group first 3 columns and based on Category value make it new column i.e. If Category has value Unique, Make it a column and add it's value to the correspondings in the group
I want my new dataframe to look like this:
A | B | C | Category | Value | Unique |
---|---|---|---|---|---|
2 | A | Prime | One | Initials | |
1 | A | Prime | Two | Seconds | 0 |
2 | B | Prime | One | Firsts | 1 |
CodePudding user response:
First need distingusih which rows are pivoted, here if Category
is Unique
, filter by boolean indexing
with DataFrame.pivot
and add to original not matched rows by ~
with DataFrame.join
:
m = df['Category'].eq('Unique')
#if need test multiple values
#m = df['Category'].isin(['Unique', 'Another val'])
df1 = df[m].pivot(index=['A','B','C'], columns='Category', values='Value')
print (df1)
Category Unique
A B C
1 A Prime 0
2 B Prime 1
df = df[~m].join(df1, on=['A','B','C'])
print (df)
A B C Category Value Unique
1 2 A Prime One Initials NaN
2 1 A Prime Two Seconds 0
4 2 B Prime One Firsts 1