如何迭代从.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。
答案 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
如果要同时访问索引,可以使用items
或iteritems
方法,该方法生成包含索引和值的生成器:
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的更多信息。