I have a table like this:
id | name | doggo | floofer | puppo | pupper |
---|---|---|---|---|---|
1 | rowa | NaN | NaN | NaN | NaN |
2 | ray | NaN | NaN | NaN | NaN |
3 | emma | NaN | NaN | NaN | pupper |
4 | sophy | doggo | NaN | NaN | NaN |
5 | jack | NaN | NaN | NaN | NaN |
6 | jimmy | NaN | NaN | puppo | NaN |
7 | bingo | NaN | NaN | NaN | NaN |
8 | billy | NaN | NaN | NaN | pupper |
9 | tiger | NaN | floofer | NaN | NaN |
10 | lucy | NaN | NaN | NaN | NaN |
I want the (doggo, floofer, puppo, pupper) columns to be in a single category column (dog_type).
Note: The NaN should also be NaN in the column since not all the dogs were categorized.
But after using:
df1 = df.melt(id_vars = ['id', 'name'], value_vars = ['doggo', 'floofer', 'pupper', 'puppo'], var_name = 'dog_types', ignore_index = True)
The melted df is now duplicated to 40 rows:
id name dog_types value
0 1 rowa doggo NaN
1 2 ray doggo NaN
2 3 emma doggo NaN
3 4 sophy doggo doggo
4 5 jack doggo NaN
5 6 jimmy doggo NaN
6 7 bingo doggo NaN
7 8 billy doggo NaN
8 9 tiger doggo NaN
9 10 lucy doggo NaN
10 1 rowa floofer NaN
11 2 ray floofer NaN
12 3 emma floofer NaN
13 4 sophy floofer NaN
14 5 jack floofer NaN
15 6 jimmy floofer NaN
16 7 bingo floofer NaN
17 8 billy floofer NaN
18 9 tiger floofer floofer
19 10 lucy floofer NaN
20 1 rowa pupper NaN
21 2 ray pupper NaN
22 3 emma pupper pupper
23 4 sophy pupper NaN
24 5 jack pupper NaN
25 6 jimmy pupper NaN
26 7 bingo pupper NaN
27 8 billy pupper pupper
28 9 tiger pupper NaN
29 10 lucy pupper NaN
30 1 rowa puppo NaN
31 2 ray puppo NaN
32 3 emma puppo NaN
33 4 sophy puppo NaN
34 5 jack puppo NaN
35 6 jimmy puppo puppo
36 7 bingo puppo NaN
37 8 billy puppo NaN
38 9 tiger puppo NaN
39 10 lucy puppo NaN
How I do get the correct results without duplicates?
df['dog_types'] = (df['doggo'].fillna(df['floofer'])
.fillna(df['puppo'])
.fillna(df['pupper']))
id name doggo floofer puppo pupper dog_types
0 1 rowa NaN NaN NaN NaN NaN
1 2 ray NaN NaN NaN NaN NaN
2 3 emma NaN NaN NaN pupper pupper
3 4 sophy doggo NaN NaN NaN doggo
4 5 jack NaN NaN NaN NaN NaN
5 6 jimmy NaN NaN puppo NaN puppo
6 7 bingo NaN NaN NaN NaN NaN
7 8 billy NaN NaN NaN pupper pupper
8 9 tiger NaN floofer NaN NaN floofer
9 10 lucy NaN NaN NaN NaN NaN
Afterwards you can drop redundant columns:
df.drop(columns=['doggo', 'floofer', 'puppo', 'pupper'], inplace=True)
id name dog_types
0 1 rowa NaN
1 2 ray NaN
2 3 emma pupper
3 4 sophy doggo
4 5 jack NaN
5 6 jimmy puppo
6 7 bingo NaN
7 8 billy pupper
8 9 tiger floofer
9 10 lucy NaN