由pandas

时间:2018-01-30 15:18:36

标签: python pandas

我对pandas.core.groupby.GroupBy.apply

有疑问

考虑

df.groupby('col1')['col2'].apply(list)

订单有保证吗?例如,以下表明它确实如此:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({"col1": ['a', 'a', 'b', 'b', 'b'], "col2": [1,2,3,4,5]})

In [3]: df.groupby('col1')['col2'].apply(list)
Out[3]:
col1
a       [1, 2]
b    [3, 4, 5]
Name: col2, dtype: object

In [4]: df = pd.DataFrame({"col1": ['a', 'a', 'b', 'b', 'b'], "col2": [2,1,3,4,5]})

In [5]: df.groupby('col1')['col2'].apply(list)
Out[5]:
col1
a       [2, 1]
b    [3, 4, 5]
Name: col2, dtype: object

但总是这样吗?

修改

pandas.DataFrame.groupbypandas.Series.groupby中都提到了保留每个组内的顺序。但是,在上面的示例中,df.groupby('col1')['col2']的类型为pandas.core.groupby.SeriesGroupBy,我不确定在这种情况下是否同样适用。我需要知道(即参考代码/文档)在应用list时保留每个组内的顺序。

2 个答案:

答案 0 :(得分:0)

这就是为什么我们有sort_values

df.sort_values(['col1','col2']).groupby('col1')['col2'].apply(list)
Out[79]: 
col1
a       [1, 2]
b    [3, 4, 5]
Name: col2, dtype: object

答案 1 :(得分:0)

是的,这应该是组中的情况。你可以认为apply是一种美化的循环。 apply逐行应用函数。当Jeff Reback在他The future of Pandas的演讲中讨论过类似内容时,我真的很惊讶。[/ p>

您可以通过查看下面的lambda表达式时发生的情况来验证这一点。

import pandas as pd
df = pd.DataFrame({"col1": ['a', 'a', 'b', 'b', 'b'], "col2": ['a','s','d','f','g']})
df.groupby('col1')['col2'].apply(lambda x: '-'.join(x))

col1
a      a-s
b    d-f-g
Name: col2, dtype: object

至于另一个范围,如果您还询问组本身的排序顺序,可以使用reset_index()sort_values()来输出输出:

df.groupby('col1')['col2'].apply(lambda x: '-'.join(x)).\
      reset_index().sort_values('col1', ascending=False)

  col1   col2
1    b  d-f-g
0    a    a-s