我有一个 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 的某种组合,但我不太确定如何做到这一点。
对于上面的示例,a
是 col1
中最常见的值,其次是 b
和 c
。因此,我希望生成的数据帧的第一行是 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/