Панды - обновление последовательности значений - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть этот пример DataFrame:

pd.DataFrame(data={1:[0,3,4,1], 2:[4,1,0,0], 3:[0,0,1,2], 4:[1,2,3,4] })

   1  2  3  4
0  0  4  0  1
1  3  1  0  2
2  4  0  1  3
3  1  0  2  4

Но я хочу преобразовать его в следующий формат:

pd.DataFrame(data={1:[1,1,1,1], 2:[0,2,0,2], 3:[0,3,3,0], 4:[4,0,4,4] })

   1  2  3  4
0  1  0  0  4
1  1  2  3  0
2  1  0  3  4
3  1  2  0  4

Есть ли способ или функция, чтобы сделать это, как яиметь более 100 000 строк, поэтому циклы, словари, списки не будут работать.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Использование zip и np.isin

pd.DataFrame([ np.isin(y, x)*df.columns.values for x , y in zip([df.columns.values]*len(df),df.values)])
Out[900]: 
   0  1  2  3
0  0  2  0  4
1  1  2  0  4
2  1  0  3  4
3  1  0  3  4
0 голосов
/ 20 сентября 2018

Моя запись:

data = df.reset_index().melt("index").query("value > 0")
out = data.pivot("index", "value", "value").fillna(0).astype(int)

давая

In [273]: out
Out[273]: 
value  1  2  3  4
index            
0      1  0  0  4
1      1  2  3  0
2      1  0  3  4
3      1  2  0  4

К сожалению, вам придется очистить индекс и имена столбцов, если вы хотите избавиться от них, используя либо df.index.name = df.columns.name = None или df.rename_axis(None).rename_axis(None, 1) или что-то.

0 голосов
/ 20 сентября 2018

Использование get_dummies:

s = pd.get_dummies(df, columns=df.columns, prefix_sep='', prefix='')
out = s.groupby(s.columns, axis=1).sum().drop('0', 1)
out.mask(out.ne(0)).fillna(dict(zip(out.columns, out.columns))).astype(int)

   1  2  3  4
0  1  0  0  4
1  1  2  3  0
2  1  0  3  4
3  1  2  0  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...