#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)