繁体   English   中英

pandas Dataframe groupby,按绝对值对组进行排序

[英]pandas Dataframe groupby, sort groups by absolute value

大家好,我基本上想找到一种有效的方法来按绝对值对分组数据进行排序。

例如:

item       itemID value
cars         A     5
             B    -3
             C     2
             D    -4
             E     1
houses       A    -2
             B     4
             C    -6
             D     3
             E     7

应该:

item        itemID value
 car          A      5
              D     -4             
              B     -3
              C      2
              E      1
houses        E      7
              C     -6
              B      4
              D      3
              A     -2

以下是dataframe和groupby以供参考:

data = {'item':['car','car','car','car','car','houses','houses','houses','houses','houses'], 'itemID':['A','B','C','D','E','A','B','C','D','E'],'value':[5,-3,2,-4,1,-2,4,-6,3,7]}
df = pd.DataFrame(data)
gdf = df.groupby('item')

我试过这个:

gdf.apply(lambda g: g.reindex(g[['value']].abs().sort('value', ascending=True).index))

并且它在大多数时候都能正常工作,但有时它会给我错误

ValueError: Shape of passed values is (100,10), indices imply (105, 10)

我在提供的数据集中并没有真正得到这个错误,但我在大型和不同的数据集中使用它,我在这里无法提供并在其中一些中得到它但我确信数据与它无关他们都非常相似。

我已经做了一些调试,每当我得到这个错误时,应用重复第一组。

那么有没有更好的方法来实现它而不使用申请?

注意:我尝试了转换,但它摆脱了组并输出了一个不同的数据集,这绝对不是我想要的,我想保留组和格式。 也许我用它错了?

考虑简单地通过定义的函数创建绝对值列,在groupby上应用函数,然后对项目升序和绝对值降序进行排序。 最后,过滤掉新创建的不需要的列:

# CREATE ABS VALUE FUNCTION TO CREATE COLUMN
def valsort(row):    
    row['absvalue'] = row['value'].abs()
    return row

# APPLY FUNCTION AND RESET DATA FRAME
gdf = df.groupby(['item', 'itemID']).apply(valsort).sort(['item', 'absvalue'], 
                                                    ascending=[1,0]).reset_index()

# FILTER OUT ABS VALUE
gdf = gdf[['item', 'itemID', 'value']]

print(gdf)

OUTPUT

     item itemID  value
0     car      A      5
1     car      D     -4
2     car      B     -3
3     car      C      2
4     car      E      1
5  houses      E      7
6  houses      C     -6
7  houses      B      4
8  houses      D      3
9  houses      A     -2
In [48]:
df['value'] = df.groupby(df.index)['value'].apply(lambda x : x[np.argsort(np.abs(x))][::-1])
df
Out[48]:
     itemID value
item        
cars    A   5
cars    B   -4
cars    C   -3
cars    D   2
cars    E   1
houses  A   7
houses  B   -6
houses  C   4
houses  D   3
houses  E   -2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM