Как «денормализовать» фрейм данных / сделать один столбец из множества двоичных столбцов - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть фрейм данных со многими двоичными столбцами, которые указывают, упоминалось ли конкретное название продукта.Я хочу создать один столбец, в котором перечислены все эти конкретные названия продуктов с 1 для этой строки.

Для простоты предположим, что это мой фрейм данных:

df = pd.DataFrame({'Name': [1,0,0], 'Another Name': [0,1,1], 'Different Name':[0,0,1]})

Я хочу создатьэтот столбец:

0 ['Name']
1 ['Another Name']
2 ['Another Name','Different Name']

Мой мыслительный процесс состоит в том, чтобы перебирать каждую строку, и, если для любого имени есть 1, добавьте это в список для столбца

namelist = list()
if df['Name']==1:
    namelist.append("Name")
else if df['Another Name']==1:
    namelist.append("Another Name")
else if df['Different Name']==1:
    namelist.append("Different Name") 

Ноэто не будет держать список, специфичный для строки.Предложения о том, как это сделать?

Мое решение: я использовал логику решения Дж. Андерсона, но мне нужно было указать интересующие столбцы, а не все в кадре данных.Я уверен, что есть лучший способ сделать это, чем я, что я и сделал, но вот что я сделал:

df['Name']=df['Name'].replace({1:'Name',0:''})
df['Another Name']=df['Another Name'].replace({1:'Another Name',0:''})
df['Different Name']=df['Different Name'].replace({1:'Different Name',0:''})

df['Product Name']=df['Name'] + df['Another Name'] + df['Different Name']

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

(обратите внимание, что я добавил строку, чтобы информационный кадр не был квадратным, чтобы помочь мне убедиться в правильности)

import pandas as pd 
df = pd.DataFrame({'Name': [1,0,0,0], 'Another Name': [0,1,1,0], 'Different Name':[0,0,1,1]})

df = pd.melt(df.mul(1+df.index,axis=0))
[(i, list(df[df.value==i].variable)) for i in set(df[df.value>0].value)]

[(1, ['Name']),
 (2, ['Another Name']),
 (3, ['Another Name', 'Different Name']),
 (4, ['Different Name'])]
0 голосов
/ 28 ноября 2018

Вот мой снимок:

df = pd.DataFrame({'Name': (1,0,0), 'Another Name': [0,1,1], 'Different Name':[0,0,1]})

    Name    Another Name    Different Name
0   1       0               0
1   0       1               0
2   0       1               1

Замените значения либо именем столбца, либо ''

for col in df.columns:
    df[col]=df[col].replace({1:col,0:''})

    Name    Another Name    Different Name
0   Name        
1           Another Name    
2           Another Name    Different Name

Добавьте столбец, который является списком других значений столбца

df['new_col']=df.iloc[:,:].apply(lambda x: [i for i in list(x) if i], axis=1)

    Name    Another Name    Different Name  new_col
0   Name                                    [Name]
1           Another Name                    [Another Name]
2           Another Name    Different Name  [Another Name, Different Name]

Удалить другие столбцы

df=df['new_col']

0                            [Name]
1                    [Another Name]
2    [Another Name, Different Name]
Name: new_col, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...