Issue
I have a dataframe such as :
Groups COL1 COL2 COL3 COL4
G1 A NaN I J
G1 A NaN I J
G1 NaN NaN Z J
G1 B K Z J
G2 NaN NaN NaN NaN
G2 NaN NaN K NaN
G3 NaN B C D
G3 NaN C C D
G3 NaN B C E
And I would like for :
1 - First, for each Group
and Column,
to get a consensus column, such as:
Groups COL1 COL2 COL3 COL4 cc_COL1 cc_COL2 cc_COL3 cc_COL4
G1 A NaN I J A K I J
G1 A NaN I J A K I J
G1 NaN NaN Z J A K Z J
G1 B K Z J A K Z J
G2 NaN NaN NaN NaN NaN NaN K NaN
G2 NaN NaN K NaN NaN NaN K NaN
G3 NaN B C D NaN B C D
G3 NaN C C D NaN B C D
G3 NaN B C E NaN B C D
When two value within a Group
and a column
are with equal numbers, I take the first one.
2- And in second step to get a representaitve_column
for each groups :
Where this column takes the non-NaN
value in that order of the following columns :
cc_COL1,cc_COL2,cc_COL3 and cc_COL4
So for instance if there is NaN
in cc_COL1
, representative_column
takes the value of cc_COL2
, but if cc_COL2
in also NaN,
it takes the value of cc_COL3
and so on until cc_COL4
. If all are NaN
, then I put NaN
.
I should then get, in that example, the following output:
Groups COL1 COL2 COL3 COL4 cc_COL1 cc_COL2 cc_COL3 cc_COL4 representative_column
G1 A NaN I J A K I J A
G1 A NaN I J A K I J A
G1 NaN NaN Z J A K Z J A
G1 B K Z J A K Z J A
G2 NaN NaN NaN NaN NaN NaN K NaN K
G2 NaN NaN K NaN NaN NaN K NaN K
G3 NaN B C D NaN B C D B
G3 NaN C C D NaN B C D B
G3 NaN B C E NaN B C D B
Here is the dataframe in dict format if it can helps :
{'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G2', 5: 'G2'}, 'COL1': {0: 'A', 1: 'A', 2: nan, 3: 'B', 4: nan, 5: nan}, 'COL2': {0: nan, 1: nan, 2: nan, 3: 'K', 4: nan, 5: nan}, 'COL3': {0: 'I', 1: 'I', 2: 'Z', 3: 'Z', 4: nan, 5: 'K'}, 'COL4 ': {0: 'J', 1: 'J', 2: 'J', 3: 'J', 4: nan, 5: nan}}
Solution
Try this:
tmp_df = df.apply(lambda col: col.groupby(df['Groups']).transform(lambda x: x.mode()[0] if len(x.mode())>0 else np.nan)).drop('Groups', axis=1)
df['representative_column'] = tmp_df.bfill(axis=1).iloc[:, 0]
Output:
>>> df
Groups COL1 COL2 COL3 COL4 cc_COL1 cc_COL2 cc_COL3 cc_COL4 representative_column
0 G1 A NaN I J A K I J A
1 G1 A NaN I J A K I J A
2 G1 NaN NaN Z J A K I J A
3 G1 B K Z J A K I J A
4 G2 NaN NaN NaN NaN NaN NaN K NaN K
5 G2 NaN NaN K NaN NaN NaN K NaN K
6 G3 NaN B C D NaN B C D B
7 G3 NaN C C D NaN B C D B
8 G3 NaN B C E NaN B C D B
Answered By - richardec
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.