python - 根据聚合计数对 Pandas DataFrame 的行进行排序并随机获取一行

标签 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)。我怎样才能在 Pandas 中做到这一点?我相信这是 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

任何一个结果都很好。更清楚地说,不允许混合来自不同行的值。一行必须完全按原样返回。

最佳答案

以下是您可以执行此操作的方法:

1)使用Series.value_counts创建一个辅助系列来获取订单

2) 使用此帮助程序系列索引原始 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

关于python - 根据聚合计数对 Pandas DataFrame 的行进行排序并随机获取一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52188764/

相关文章:

python - 如果脚本有时会锁定并永远运行,如何定期安排脚本

python - opencv缩放函数奇怪的结果

python - 在 block 样式 yaml 文件 (ruamel.yaml) 中将来自 Python 的列表显示为流样式

python - SQLAlchemy 无法自动加载 mssql 临时表

python - 如何使用 pandas 或其他 Python 包绘制漂亮的彩色表格?

python - 根据 python pandas 中其他列的值创建一个新列

python - oauth、python 和谷歌 API?

python - 如何按天将分组数据帧中的值映射到非分组数据帧

python - 将一列热编码数据添加到数据帧

python - Pandas DataFrame 基于条件的切片列