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