У меня есть набор данных, похожий на этот:
data = {'lat': [0.15, 0.15, 0.15, 0.15, 0.25, 0.25, 0.48, 0.48, 0.48, 0.48],
'lon': [0.87, 0.87, 0.87, 0.87, 0.12, 0.12, 0.59, 0.59, 0.59, 0.59],
'animal': ['dog', 'cat', 'rat', 'rat', 'cat', 'rat', 'cat', 'dog', 'dog', 'rat'],
'category': ['A', 'C', 'B', 'C', 'B', 'B', 'C', 'A', 'C', 'C']}
mdf = pd.DataFrame(data)
mdf
Out[460]:
lat lon animal category
0 0.15 0.87 dog A
1 0.15 0.87 cat C
2 0.15 0.87 rat B
3 0.15 0.87 rat C
4 0.25 0.12 cat B
5 0.25 0.12 rat B
6 0.48 0.59 cat C
7 0.48 0.59 dog A
8 0.48 0.59 dog C
9 0.48 0.59 rat C
Я хочу использовать 'animal', 'lat' и 'lon' в качестве каких-то индексов, чтобы получить что-то вроде этого:
lat lon animal A B C
0 0.15 0.87 dog True False False
1 0.15 0.87 cat False False True
2 0.15 0.87 rat False True True
4 0.25 0.12 cat False True False
5 0.25 0.12 rat False True False
6 0.48 0.59 cat False False True
7 0.48 0.59 dog True False True
9 0.48 0.59 rat False False True
Мне все равно, правда ли это / Ложь, 1/0 и т. Д. 1042 *. пока я вижу, какие категории есть в каждой комбинации 'lat', 'long' и 'animal'.
Я безуспешно пробовал несколько альтернатив: pivot, pivot_table, groupby, stack / unstack. ... но ни один из них не отвечает моим потребностям.
Единственный оставленный вариант - перебирать различные альтернативы 'lat', 'lon', 'animal' и проверять, есть ли место для каждого из 'category'.
Может быть, это можно сделать как-нибудь, определив 'lat', 'lon', 'animal' в качестве индексов и каким-то образом "расплавить"
Есть предложения?
Спасибо.
РЕДАКТИРОВАТЬ: я не могу иметь новые строки в комментариях, и я не знаю, как связаться с человеком, который закрыл пост, поэтому позвольте мне привести некоторые дополнительные объяснения здесь. Извиняюсь за досаду.
Quang, спасибо за вашу ссылку на другую ветку. Однако я не уверен, что это мне поможет.
Я мог бы сделать это:
pd.get_dummies(mdf['category'], prefix='', prefix_sep='')
Но я получаю свои первые 10 строк вместо таблицы, к которой я стремился.
Чтобы получить что-то полезное с помощью get_dummies, я должен был бы сделать это:
mdf = mdf.join(pd.get_dummies(mdf['category'], prefix='', prefix_sep=''))
mdf[['A', 'B', 'C']] = mdf.groupby(['lat', 'lon', 'animal'])[['A', 'B', 'C']].transform('sum')
mdf.drop_duplicates(subset=['lat', 'lon', 'animal'], inplace=True)
d = {1: True,
0: False}
mdf[['A', 'B', 'C']] = mdf[['A', 'B', 'C']].replace(d)
mdf.drop('category',
axis=1,
inplace=True)
Но это кажется слишком сложным, и я чувствую, что должен быть лучший способ ...
Я также подумал по этому поводу:
mdf['value'] = [True] * 10
mdf = mdf.set_index(['lat', 'lon', 'animal', 'category'])
mdf = mdf.unstack(fill_value=False)
mdf = mdf.reset_index()
mdf.columns = ['lat', 'lon', 'animal', 'A', 'B', 'C']
Но, опять же, кажется непонятным c обманывать систему, играя с индексами ...
Наверняка должен быть лучший путь!
Спасибо.