根据汇总计数对Pandas DataFrame的行进行排序,并随机获得一行

时间:2018-09-05 15:27:38

标签: python pandas dataframe pandas-groupby

我有一个带有以下列的Pandas DataFrame:

col1 col2 col3 col4 col5

a a1 foo1 foo2 foo3

b b1 foo4 foo5 foo6

c c1 foo7 foo8 foo9

a a2 foo10 foo11 foo12

a a3 foo13 foo14 foo15

b b2 foo16 foo17 foo18

我想根据col1中值的降频频率对该数据帧的行(整个行)进行排序,然后针对该行中的其他列,获取其值中具有该值的行之一列(类似于SQL group by)。如何在熊猫中做到这一点?我相信这是groupby和sort_values的某种组合,但我不确定如何做到。

对于上面的示例,acol1中最常见的值,其后依次是bc。因此,我希望结果数据帧的第一行是col1值为a的行之一。下一行应该是值为b的两行之一。最后一行是唯一具有值c的行。

所以这是一个答案:

col1 col2 col3 col4 col5

a a1 foo1 foo2 foo3

b b1 foo4 foo5 foo6

c c1 foo7 foo8 foo9

但这个也是:

col1 col2 col3 col4 col5

a a3 foo13 foo14 foo15

b b1 foo4 foo5 foo6

c c1 foo7 foo8 foo9

还有一个:

col1 col2 col3 col4 col5

a a2 foo10 foo11 foo12

b b2 foo16 foo17 foo18

c c1 foo7 foo8 foo9

所有这些都可以。更清楚地说,不允许混合来自不同行的值。必须完全按原样返回一行。

2 个答案:

答案 0 :(得分:3)

这是您可以执行的操作:

1)使用expr1 = '^b$'; regexp('a', expr1, 'match', 'emptymatch') % Result = {} regexp('b', expr1, 'match', 'emptymatch') % Result = {'b'} regexp('', expr1, 'match', 'emptymatch') % Result = {} expr2 = '^$'; regexp('a', expr2, 'match', 'emptymatch') % Result = {} regexp('', expr2, 'match', 'emptymatch') % Result = {''} expr3 = '^b?$'; regexp('a', expr3, 'match', 'emptymatch') % Result = {} regexp('b', expr3, 'match', 'emptymatch') % Result = {'b'} regexp('', expr3, 'match', 'emptymatch') % Result = {''} expr5 = '^.*$'; regexp('b', expr5, 'match', 'emptymatch') % Result = {'b'} regexp('', expr5, 'match', 'emptymatch') % Result = {''} 创建帮助系列以获取订单

2)使用该帮助器系列索引原始df,并删除重复的Series.value_counts值。

col1

或一行:

s = df.col1.value_counts()
df.set_index('col1').loc[s.index].reset_index().drop_duplicates('col1')

[输出]

df2 = (df.set_index('col1')
       .loc[df.col1.value_counts().index]
       .reset_index()
       .drop_duplicates('col1'))

答案 1 :(得分:1)

这是一种非常简单的方法,首先按col1排序,然后删除重复项:

Task.WhenAny

第1部分的输出:

import pandas as pd
df = pd.read_csv('funky.csv')
df.sort_values('col1', ascending=True, inplace=True)
df

然后仅将重复项放在列1中:

  col1 col2   col3   col4   col5
0    a   a1   foo1   foo2   foo3
3    a   a2  foo10  foo11  foo12
4    a   a3  foo13  foo14  foo15
1    b   b1   foo4   foo5   foo6
5    b   b2  foo16  foo17  foo18
2    c   c1   foo7   foo8   foo9

输出:

df2 = df.drop_duplicates(['col1'])
df2