我有一个数据框,其中两列是经度和纬度。每个纬度对代表一个位置,我想按该位置分组。
我可以通过将两列转换为元组的单个列,然后对该列进行groupby操作来执行groupby操作。但是,我的实际数据帧非常大,添加另一列可能会减慢速度。我想知道在熊猫中是否还有一种更惯用的方式。
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'))
的事情,并让大熊猫将这两列都视为一列。有没有办法做到这一点?还是我该咬一下子弹,然后在数据元组中添加一个新列?
答案 0 :(得分:3)
不是零件
目前,我希望能够执行类似
的操作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
这不是您想要的,还是我误会了一些东西?