在Pandas DataFrame中按分组操作后的复杂聚合

时间:2015-12-08 16:43:07

标签: python python-3.x pandas

我在Pandas中有这个DataFrame,我已经按照列分组了。

在此操作之后,我需要生成行之间的所有唯一对 每个组并对一组的所有对执行一些聚合操作。

我已经实现了以下示例算法来为您提供一个想法。我想重构这段代码,以使其与pandas一起使用,以提高性能和/或降低代码复杂性。

代码:

import numpy as np
import pandas as pd
import itertools

#Construct Dataframe
samples=40
a=np.random.randint(3,size=(1,samples))
b=np.random.randint(9,size=(1,samples))
c=np.random.randn(1,samples)
d=np.append(a,b,axis=0)
e=np.append(d,c,axis=0)
e=e.transpose()
df = pd.DataFrame(e,columns=['attr1','attr2','value'])
df['attr1'] = df.attr1.astype('int')
df['attr2'] = df.attr2.astype('int')

#drop duplicate rows so (attr1,attr2) will be key
df = df.drop_duplicates(['attr1','attr2'])
#df = df.reset_index()
print(df)


for key,tup in df.groupby('attr1'):

    print('Group',key,' length ',len(tup))
    #generate pairs
    agg=[]
    for v1,v2 in itertools.combinations(list(tup['attr2']),2):
        p1_val = float(df.loc[(df['attr1']==key) & (df['attr2']==v1)]['value'])
        p2_val = float(df.loc[(df['attr1']==key) & (df['attr2']==v2)]['value'])
        agg.append([key,(v1,v2),(p1_val-p2_val)**2])

    #insert pairs to dataframe
    p = pd.DataFrame(agg,columns=['group','pair','value'])
    top = p.sort_values(by='value').head(4)
    print(top['pair'])
    #Perform some operation in df based on pair values
    #....

我真的害怕pandas DataFrames无法提供如此复杂的分析功能。

我是否必须像示例中那样坚持使用传统的python?

我是Pandas的新手,所以欢迎任何意见/建议。

0 个答案:

没有答案