Python 如何在大数据框中对组内的行进行排序

Python 如何在大数据框中对组内的行进行排序,python,pandas,numpy,Python,Pandas,Numpy,我有一个相对较大的数据帧(1.5GB),我希望在每个组中按ID对行进行分组,并按列VAL对行进行升序 df = ID VAL COL 1A 2 BB 1A 1 AA 2B 2 CC 3C 3 SS 3C 1 YY 3C 2 XX 这是预期的结果: df = ID VAL COL 1A 1 AA 1A 2 BB 2B 2 CC 3C 1 YY 3C 2 XX 3C

我有一个相对较大的数据帧(1.5GB),我希望在每个组中按
ID
对行进行分组,并按列
VAL
对行进行升序

df =

ID   VAL  COL
1A   2    BB
1A   1    AA
2B   2    CC
3C   3    SS
3C   1    YY
3C   2    XX 
这是预期的结果:

df =

ID   VAL  COL
1A   1    AA
1A   2    BB
2B   2    CC
3C   1    YY
3C   2    XX
3C   3    SS
这是我尝试过的,但它运行了很长时间。有没有更快的解决方案

df = df.groupby("ID").apply(pd.DataFrame.sort, 'VAL')

'ID',VAL'
上的值进行排序

In [39]: df.sort_values(by=['ID', 'VAL'])
Out[39]:
   ID  VAL COL
1  1A    1  AA
0  1A    2  BB
2  2B    2  CC
4  3C    1  YY
5  3C    2  XX
3  3C    3  SS
为您的用例计时

In [89]: dff.shape
Out[89]: (12000, 3)

In [90]: %timeit dff.sort_values(by=['ID', 'VAL'])
100 loops, best of 3: 2.62 ms per loop

In [91]: %timeit dff.iloc[np.lexsort((dff.VAL.values, dff.ID.values))]
100 loops, best of 3: 8.8 ms per loop

'ID',VAL'
上的值进行排序

In [39]: df.sort_values(by=['ID', 'VAL'])
Out[39]:
   ID  VAL COL
1  1A    1  AA
0  1A    2  BB
2  2B    2  CC
4  3C    1  YY
5  3C    2  XX
3  3C    3  SS
为您的用例计时

In [89]: dff.shape
Out[89]: (12000, 3)

In [90]: %timeit dff.sort_values(by=['ID', 'VAL'])
100 loops, best of 3: 2.62 ms per loop

In [91]: %timeit dff.iloc[np.lexsort((dff.VAL.values, dff.ID.values))]
100 loops, best of 3: 8.8 ms per loop

如果您有一个大的
df
并且速度很重要,请尝试一点
numpy

# note order of VAL first, then ID is intentional
# np.lexsort sorts by right most column first
df.iloc[np.lexsort((df.VAL.values, df.ID.values))]

   ID  VAL COL
1  1A    1  AA
0  1A    2  BB
2  2B    2  CC
4  3C    1  YY
5  3C    2  XX
3  3C    3  SS

超级充电

v = df.values
i, j = np.searchsorted(df.columns.values, ['VAL', 'ID'])
s = np.lexsort((v[:, i], v[:, j]))
pd.DataFrame(v[s], df.index[s], df.columns)
定时

v = df.values
i, j = np.searchsorted(df.columns.values, ['VAL', 'ID'])
s = np.lexsort((v[:, i], v[:, j]))
pd.DataFrame(v[s], df.index[s], df.columns)

如果你有一个大的
df
并且速度很重要,试一下
numpy

# note order of VAL first, then ID is intentional
# np.lexsort sorts by right most column first
df.iloc[np.lexsort((df.VAL.values, df.ID.values))]

   ID  VAL COL
1  1A    1  AA
0  1A    2  BB
2  2B    2  CC
4  3C    1  YY
5  3C    2  XX
3  3C    3  SS

超级充电

v = df.values
i, j = np.searchsorted(df.columns.values, ['VAL', 'ID'])
s = np.lexsort((v[:, i], v[:, j]))
pd.DataFrame(v[s], df.index[s], df.columns)
定时

v = df.values
i, j = np.searchsorted(df.columns.values, ['VAL', 'ID'])
s = np.lexsort((v[:, i], v[:, j]))
pd.DataFrame(v[s], df.index[s], df.columns)

请注意,有一个
inplace
参数可以避免执行额外的赋值。请注意,有一个
inplace
参数可以避免执行额外的赋值。这些计时基于什么
df.shape
?我认为对于较大的df,
df.iloc[…]
方法不会比
sort\u值
更快。@JohnGalt示例给定。超级充电版本应该是好的。如果我以后有机会,我会用更大的样本更新。这些时间是在什么
df.shape
?我认为对于较大的df,
df.iloc[…]
方法不会比
sort\u值
更快。@JohnGalt示例给定。超级充电版本应该是好的。如果我以后有机会,我会更新更大的样本。