Pandas groupby: обрабатывать две колонки как одну - PullRequest
0 голосов
/ 11 января 2019

У меня есть датафрейм, два столбца - широта и долгота. Каждая лат-лон-пара представляет одно местоположение, и я хотел бы сгруппировать это местоположение.

Я мог бы выполнить эту групповую операцию, преобразовав два столбца в один столбец кортежей и сгруппировав этот столбец. Тем не менее, мой фактический фрейм данных очень большой, и добавление еще одного столбца может реально замедлить процесс. Я хотел бы знать, есть ли более идиоматический способ сделать это в пандах.

In [1]: import pandas as pd                                                                                                                                                                                 
In [2]: import numpy as np                                                                                                                                                                                  
In [3]: key  = np.random.randint(low = 1, high = 20, size = 100) 
   ...: data = np.random.random(size = (100)) 
   ...: d1   = {'key':key, 'time':range(1,101), 'data':data} 
   ...: df1  = pd.DataFrame(d1) 
   ...: print(df1.shape) 
   ...: df1.head()                                                                                                                                                                                                 
(100, 3)
Out[3]: 
    key  time      data
0     3     1  0.778231
1    13     2  0.822494
2     4     3  0.053416
3     8     4  0.894341
4     7     5  0.884310
In [4]: key = range(1,21) 
   ...: lat = np.random.randint(low = 0, high = 90, size = 20) 
   ...: lon = np.random.randint(low = 0, high = 90, size = 20) 
   ...: d2  = {'key':key, 'lat':lat, 'lon':lon} 
   ...: df2 = pd.DataFrame(d2) 
   ...: print(df2.shape) 
   ...: df2.head()                                                                                                                                                                                                 
(20, 3)
Out[4]: 
    key  lat  lon
0     1   36   81
1     2    6   57
2     3   84    4
3     4   61    0
4     5   54   69
In [5]: result = pd.merge(df1, df2).sort_values('time') 
   ...: result.head()                                                                                                                                                                                            
Out[5]: 
    key  time      data  lat  lon
0     3     1  0.778231   84    4
4    13     2  0.822494   12   19
13    4     3  0.053416   61    0
18    8     4  0.894341   49   34
23    7     5  0.884310    8   13

(Обязательно прокрутите вниз в поле, чтобы увидеть вывод In [5], поскольку именно так выглядит мой последний фрейм данных)

В этот момент я хотел бы иметь возможность сделать что-то вроде result.groupby(('lat','lon')), и чтобы панды рассматривали оба столбца как один. Есть ли способ сделать это? Или я должен просто прикусить пулю и создать новый столбец кортежей данных?

1 Ответ

0 голосов
/ 11 января 2019

Разве не часть

На данный момент я хотел бы иметь возможность сделать что-то вроде result.groupby(('lat','lon'))

точно ответ, который вы ищете? Он будет группировать уникальные значения в любом количестве столбцов.

Пример данных:

key  time     data  lat  lon
3     1   0.231000   84    4
4     1   0.832310   22   11
5     1   1.210000   84    4
6     1   3.778231   22   11
8     1  15.450000   84    4

Как сгруппировать уникальные значения в эти два столбца:

import pandas as pd

for name, group in df.groupby(["lat", "lon"]):
    print("Group indices: {}".format(name))
    print(group)

Выход:

Group indices: (22, 11)
   key  time      data  lat  lon
1    4     1  0.832310   22   11
3    6     1  3.778231   22   11
Group indices: (84, 4)
   key  time    data  lat  lon
0    3     1   0.231   84    4
2    5     1   1.210   84    4
4    8     1  15.450   84    4

Разве это не то, что вы хотели, или я что-то неправильно понял?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...