我有一个带有以下列的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的某种组合,但我不确定如何做到。
对于上面的示例,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
所有这些都可以。更清楚地说,不允许混合来自不同行的值。必须完全按原样返回一行。
答案 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