如何迭代从groupby()生成的Pandas系列.size()

时间:2016-07-15 03:43:33

标签: python pandas

如何迭代从.groupby('...').size()命令生成的Pandas系列并同时获取组名和计数。

如果我有一个例子:

foo
-1     7
 0    85
 1    14
 2     5

我怎样才能循环它们以便每次迭代我都会得到-1& 7,0和0 85,1和& 14和2& 5变量?

我尝试了枚举选项,但它不太有用。例如:

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

它不会为i返回-1,0,1和2,而是返回0,1,2,3。

2 个答案:

答案 0 :(得分:49)

<强>更新

鉴于熊猫系列:

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

旧答案

您可以在系列节目中调用iteritems()方法:

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

# 12 4
# 14 2

根据文件:

  

Series.iteritems()

     

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

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

答案 1 :(得分:4)

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

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

  • s上进行直接循环会产生每一行的value
  • 循环 s.iteritems()s.items()产生一个(index,value)元组 每行对。
  • enumerate()上使用s.iteritems()会产生一个 嵌套元组的形式为:(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的更多信息。