【问题标题】:How to iterate over Pandas Series generated from groupby().size()如何迭代从 groupby().size() 生成的 Pandas 系列
【发布时间】:2016-07-15 03:43:33
【问题描述】:

您如何遍历从.groupby('...').size() 命令生成的 Pandas 系列并获取组名和计数。

例如,如果我有:

foo
-1     7
 0    85
 1    14
 2     5

我如何循环它们,以便在每次迭代中我都会在变量中包含 -1 & 7、0 & 85、1 & 14 和 2 & 5?

我尝试了 enumerate 选项,但效果不佳。示例:

for i, row in enumerate(df.groupby(['foo']).size()):
    print(i, row)

i 不返回 -1、0、1 和 2,而是返回 0、1、2、3。

【问题讨论】:

  • enumerate 只计算任何序列中的项目数,它对 Series 的内部索引一无所知,这就是为什么它只是 0、1、2、3 并且对于任何可迭代对象都相同
  • 大多数使用 pandas 的数值运算都可以向量化——这意味着它们比传统迭代要快得多。 OTOH,某些操作(例如字符串和正则表达式)本质上很难矢量化。在这种情况下,了解 如何 循环数据非常重要。有关何时以及如何循环数据的更多信息,请阅读For loops with Pandas - When should I care?

标签: python pandas


【解决方案1】:

更新

给定一个熊猫系列:

s = pd.Series([1,2,3,4], index=['a', 'b', 'c', 'd'])

s
#a    1
#b    2
#c    3
#d    4
#dtype: int64

您可以直接循环遍历它,在每次迭代中从系列中产生一个值:

for i in s:
    print(i)
1
2
3
4

如果要同时访问索引,可以使用itemsiteritems 方法,它会生成一个包含索引和值的生成器:

for i, v in s.items():
    print('index: ', i, 'value: ', v)
#index:  a value:  1
#index:  b value:  2
#index:  c value:  3
#index:  d value:  4

for i, v in s.iteritems():
    print('index: ', i, 'value: ', v)
#index:  a value:  1
#index:  b value:  2
#index:  c value:  3
#index:  d value:  4

旧答案

您可以在 Series 上调用iteritems() 方法:

for i, row in df.groupby('a').size().iteritems():
    print(i, row)

# 12 4
# 14 2

根据文档:

Series.iteritems()

懒惰地迭代(索引,值)元组

注意:这与问题中的数据不同,只是一个演示。

【讨论】:

  • 这就是我一直在寻找的解决方案 - 谢谢。我曾尝试过.iterrows(),但它没有提供我正在寻找的解决方案。
  • iterrows() 是数据框和系列的方法,iteritems() 有效。
【解决方案2】:

为了扩展 Psidom 的答案,有三种有用的方法可以从 pd.Series 解压数据。与 Psidom 同系列:

s = pd.Series([1,2,3,4], index=['a', 'b', 'c', 'd'])

  • s 的直接循环会产生每一行的value
  • 循环结束 s.iteritems()s.items() 产生一个带有 (index,value) 的元组 每行成对。
  • s.iteritems() 上使用enumerate() 会产生一个 嵌套元组的形式为:(rownum,(index,value))

如果您的索引包含行号本身以外的其他信息(例如,在索引为时间的时间序列的情况下),最后一种方法很有用。

s = pd.Series([1,2,3,4], index=['a', 'b', 'c', 'd'])

for rownum,(indx,val) in enumerate(s.iteritems()):
    print('row number: ', rownum, 'index: ', indx, 'value: ', val)

将输出:

row number:  0 index:  a value:  1
row number:  1 index:  b value:  2
row number:  2 index:  c value:  3
row number:  3 index:  d value:  4

您可以阅读更多关于解包嵌套元组here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2020-09-11
    • 2022-09-29
    • 2021-07-04
    • 2019-08-03
    • 2017-04-11
    相关资源
    最近更新 更多