【发布时间】:2013-07-20 12:01:16
【问题描述】:
我来自sql背景,我经常使用以下数据处理步骤:
- 按一个或多个字段对数据表进行分区
- 对于每个分区,将行号添加到其每一行,该行按一个或多个其他字段对行进行排名,分析师指定升序或降序
前:
df = pd.DataFrame({'key1' : ['a','a','a','b','a'],
'data1' : [1,2,2,3,3],
'data2' : [1,10,2,3,30]})
df
data1 data2 key1
0 1 1 a
1 2 10 a
2 2 2 a
3 3 3 b
4 3 30 a
我正在寻找如何做相当于这个sql窗口函数的PANDAS:
RN = ROW_NUMBER() OVER (PARTITION BY Key1 ORDER BY Data1 ASC, Data2 DESC)
data1 data2 key1 RN
0 1 1 a 1
1 2 10 a 2
2 2 2 a 3
3 3 3 b 1
4 3 30 a 4
我已经尝试了以下没有“分区”的工作:
def row_number(frame,orderby_columns, orderby_direction,name):
frame.sort_index(by = orderby_columns, ascending = orderby_direction, inplace = True)
frame[name] = list(xrange(len(frame.index)))
我试图将这个想法扩展到使用分区(pandas 中的组),但以下方法不起作用:
df1 = df.groupby('key1').apply(lambda t: t.sort_index(by=['data1', 'data2'], ascending=[True, False], inplace = True)).reset_index()
def nf(x):
x['rn'] = list(xrange(len(x.index)))
df1['rn1'] = df1.groupby('key1').apply(nf)
但是当我这样做时,我得到了很多 NaN。
理想情况下,会有一种简洁的方法来复制 sql 的窗口函数功能(我已经想出了基于窗口的聚合...这是 pandas 中的一条线)...有人可以与我分享最多在 PANDAS 中像这样对行进行编号的惯用方法?
【问题讨论】:
-
看来你应该可以多栏
.rank...
标签: python pandas numpy dataframe