【问题标题】:Pandas: iterate over unique values of a column that is already in sorted orderPandas:遍历已经排序的列的唯一值
【发布时间】:2014-01-07 00:50:06
【问题描述】:

我已按排序顺序构建了一个 pandas 数据框,并希望遍历具有特定列的相同值的组。在我看来,groupby 功能对此很有用,但据我所知,执行 groupby 并不能保证密钥的顺序。如何按排序顺序提取 unqiue 列值。

这是一个示例数据框:

Foo,1
Foo,2
Bar,2
Bar,1

我想要一个列表 ["Foo","Bar"],其中的顺序由原始数据框的顺序保证。然后我可以使用这个列表来提取适当的行。在我的例子中,排序实际上是由数据框中给出的列(不包括在上面的示例中)定义的,因此如果不能直接提取信息,则重新排序的解决方案是可以接受的。

【问题讨论】:

  • 您能否提供代码来说明您的情况为何会失败?我的经验是,在 Pandas 中的 groupby 之后,新数据框 的顺序与原始未分组数据框的顺序相同。如果您可以提供少量代码来构建玩具数据框,执行分组,然后显示手头的问题,那将很有帮助。
  • 如果您只需要一个列中相同顺序的唯一值列表,为什么不直接使用:df.c1.unique(),其中 c1 是您要为其设置唯一值的列的名称.

标签: python group-by pandas


【解决方案1】:

如 cmets 中所述,您可以在列上使用 unique 来保留顺序(与 numpy 的 unique 不同,它不排序):

In [11]: df
Out[11]: 
     0  1
0  Foo  1
1  Foo  2
2  Bar  2
3  Bar  1

In [12]: df[0].unique()
Out[12]: array(['Foo', 'Bar'], dtype=object)

然后您可以使用 groupby 的get_group 访问相关行:

In [13]: g = df.groupby([0])

In [14]: g.get_group('Foo')
Out[14]: 
     0  1
0  Foo  1
1  Foo  2    

【讨论】:

  • 当我尝试使用上面的示例时,我得到“数组”未定义。它是在某个地方定义的吗?
  • @aging_gorrila 输出行是 output 行(来自 ipython)。 DataFrame 是通过阅读上述问题中的 csv 来定义的,但您自己的也可以。
  • array 只是指 Pandas 用来存储数据的底层 NumPy ndarray (np.ndarray)
猜你喜欢
  • 1970-01-01
  • 2021-10-30
  • 2014-02-11
  • 2019-03-28
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多