Переместить значения столбцов в значения с помощью True / False - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть набор данных, похожий на этот:

 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 обманывать систему, играя с индексами ...

Наверняка должен быть лучший путь!

Спасибо.

1 Ответ

0 голосов
/ 26 февраля 2020

Если исходные значения индекса не имеют значения, вы можете использовать get_dummies для преобразования столбцов A, B и C в исходный кадр данных, затем сгруппировать по широте и животному и суммировать логические столбцы. :

categs = np.sort(mdf['category'].unique())

resul = pd.concat([mdf, pd.get_dummies(mdf['category']).astype(bool)], axis=1
                  ).groupby(['lat', 'lon', 'animal'])[categs].sum().reset_index()

дает:

    lat   lon animal      A      B      C
0  0.15  0.87    cat  False  False   True
1  0.15  0.87    dog   True  False  False
2  0.15  0.87    rat  False   True   True
3  0.25  0.12    cat  False   True  False
4  0.25  0.12    rat  False   True  False
5  0.48  0.59    cat  False  False   True
6  0.48  0.59    dog   True  False   True
7  0.48  0.59    rat  False  False   True
...