Скажем, у меня есть этот фрейм данных
id | car | sex | income
-------------------------------
1 | European | Male | 45000
2 | Japanese | Female | 48000
3 | American | Male | 53000
Есть ли простой способ создать его (с помощью панд)?
| id | car | choice | sex | income
1.| 1 | European | 1 | Male | 45000
2.| 1 | American | 0 | Male | 45000
3.| 1 | Japanese | 0 | Male | 45000
| ----------------------------------------
4.| 2 | European | 0 | Female | 48000
5.| 2 | American | 0 | Female | 48000
6.| 2 | Japanese | 1 | Female | 48000
| ----------------------------------------
7.| 3 | European | 0 | Male | 53000
8.| 3 | American | 1 | Male | 53000
9.| 3 | Japanese | 0 | Male | 53000
Идея состоит в том, чтобы получить каждую модальность переменной «автомобиль» в базе и указать, какую из них выбрал каждый человек, с помощью переменной «выбор». Например, в первой таблице человек с id 1 выбрал европейский автомобиль, поэтому choice равен 1 в строке, где car - европейский, и нулю в строке, где car соответствует американскому или японскому.
Я уже написал что-то, что делает это вручную (используя словарь), но я хотел знать, существует ли более чистое решение.
(Это имеет целью отформатировать данные, чтобы использовать asclogit / nlogit под Stata)






Не уверен, что вы имеете в виду случайные двоичные целые числа, а не «фиктивные переменные». «фиктивные переменные» обычно используются для присвоения числовой переменной нечисловым значениям. (Фиктивные переменные)
Если вы пытаетесь назначить случайные двоичные целые числа новому пустому столбцу, вы можете использовать numpy.random.rand (Numpy.random.rand)
В качестве примера:
df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'],'C': [1, 2, 3]})
A B C
0 a b 1
1 b a 2
3 a c 3
df['randNumCol'] = np.random.randint(0,1, size=len(df))
A B C randNumCol
0 a b 1 0
1 b a 2 1
3 a c 3 0
Укажите диапазон случайных целых чисел до 0,1
Я считаю, что нужно:
df = df.assign(choice = 1).set_index(['id','car'])
df = df.reindex(pd.MultiIndex.from_product(df.index.levels, names=df.index.names))
df = (df.assign(choice=df['choice'].fillna(0).astype(int))
.groupby(level=0).apply(lambda x: x.ffill().bfill())
.reset_index())
print (df)
id car sex income choice
0 1 American Male 45000.0 0
1 1 European Male 45000.0 1
2 1 Japanese Male 45000.0 0
3 2 American Female 48000.0 0
4 2 European Female 48000.0 0
5 2 Japanese Female 48000.0 1
6 3 American Male 53000.0 1
7 3 European Male 53000.0 0
8 3 Japanese Male 53000.0 0
Объяснение:
1. Сначала создайте новый столбец с 1 с помощью assign
2.Создайте MultiIndex с помощью set_index
3.Сгенерируйте все возможные комбинации с помощью MultiIndex.from_product и создайте новые строки с помощью reindex
4.Затем замените NaN на 0 в столбце choice
.
5. Последний раз замените NaN во всех остальных столбцах на прямую и обратную засыпку.
Это не то, что я ожидал, но спасибо :)! Я отредактировал свой пост и дал больше точности