基于聚合计数对数据帧的行进行排序,并随机获得一行

2024-06-28 19:09:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,列如下:

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\u值的某种组合,但我不确定如何做到这一点。你知道吗

对于上述示例,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

任何这些都可以作为结果。更清楚的是,不允许混合来自不同行的值。行必须按原样返回。你知道吗


Tags: 数据a1b1col2col3col1c1col4
2条回答

以下是如何做到这一点:

1)使用Series.value_counts创建一个helper系列来获取顺序

2)用这个helper系列索引您的原始df并删除重复的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'))

[输出]

    col1    col2    col3    col4    col5
0   a       a1      foo1    foo2    foo3
3   b       b1      foo4    foo5    foo6
5   c       c1      foo7    foo8    foo9

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

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

然后只需在第1列中删除重复项:

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

输出:

  col1 col2  col3  col4  col5
0    a   a1  foo1  foo2  foo3
1    b   b1  foo4  foo5  foo6
2    c   c1  foo7  foo8  foo9

相关问题 更多 >