Создайте 2D-массив с 2 столбцами из фрейма данных и цикла для значения

#python #arrays #dataframe #loops

#python #массивы #фрейм данных #циклы

Вопрос:

У меня есть огромный фрейм данных, который выглядит следующим образом:

     u_id  i_id  
0  55218    0      
1  55218    2       
2  55218    1       
3  55222    2 
4  55222    3      
  

Я хочу создать массив с осями u_id i_id и значением 1 (если u_id имеет i_id ) и 0 в противном случае.
Вот так:

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

Я создал массив с:

 df_neu = np.full(df[['u_id', 'i_id']].nunique(), 0)
  

но теперь я не знаю, как перезаписать 0 .

Ответ №1:

Пожалуйста, попробуйте:

 df = df.groupby('u_id')['i_id'].apply(list).reset_index()
def fill(x):
    for val in x.i_id:
        df_un[x.name,val] = 1
df.apply(lambda x: fill(x), axis=1)

print(df_un)

[[1 1 1 0]
 [0 0 1 1]]
  

Комментарии:

1. что такое df_un? новый фрейм данных?

2. Это тот же массив numpy, который вы создали `df_neu = np.full(df[[‘u_id’, ‘i_id’]].nunique(), 0)’ .. Я только что переименовал if df_un.. Я пытался построить поверх вашего.

Ответ №2:

Я думаю, что это

 columns = sorted(set(df['i_id'].values))
df_neu = pd.DataFrame({key: [1 if c in group['i_id'].values else 0
                             for c in columns]
                       for key, group in df.groupby('u_id')},
                      index=columns).T
  

по сути, это приводит к ожидаемому результату:

        0  1  2  3
55218  1  1  1  0
55222  0  0  1  1
  

Я предполагаю, что ваш исходный фрейм данных имеет имя df .

Если вы хотите избавиться от u_id индекса:

 df_neu.reset_index(drop=True, inplace=True)
  
    0  1  2  3
0  1  1  1  0
1  0  0  1  1
  

Или a без транспонирования:

 columns = sorted(set(df['i_id'].values))
df_neu = pd.DataFrame([[1 if c in group['i_id'].values else 0
                        for c in columns]
                       for _, group in df.groupby('u_id')],
                      columns=columns)