迭代pandas DataFrame的“条目”

时间:2018-04-01 02:40:36

标签: pandas dataframe

假设我有一个(可能是多索引的,但可能不是)数据帧。例如:

iterables = [['foo', 'bar'], ['one', 'two']]
idx = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(4, 2), index=idx, columns=('metric1', 'metric2'))

结果:

               metric1   metric2
first second                    
foo   one     0.189589  0.787533
      two     0.176290 -0.080153
bar   one     0.077977 -0.384613
      two     0.658583  0.436177

有很多方法可以迭代这个数据框中的每个元素,但是大多数方法都涉及两个嵌套的for循环,如:

for r in df.index:
    for c in df.columns:
        print r, c, df.loc[r,c]

产生

('foo', 'one') metric1 -0.00381142017312
('foo', 'one') metric2 -0.755465118408
('foo', 'two') metric1 0.444271742766
('foo', 'two') metric2 0.18390288873
('bar', 'one') metric1 0.512679930964
('bar', 'one') metric2 -0.134535924251
('bar', 'two') metric1 1.93222192752
('bar', 'two') metric2 0.609813960012

有没有办法在一个循环中执行此操作(这样我可以在迭代时访问每个元素的行名和列名)?如果只有常规的Index我才会感兴趣。

1 个答案:

答案 0 :(得分:1)

您可以将数据框堆叠为一个系列,然后一次性循环:

for ind, val in df.stack().items():
    print(ind, val)

('foo', 'one', 'metric1') -0.752747101421
('foo', 'one', 'metric2') 0.318196702146
('foo', 'two', 'metric1') -0.737599211438
('foo', 'two', 'metric2') -1.08364260415
('bar', 'one', 'metric1') 1.87757917778
('bar', 'one', 'metric2') -2.29588862481
('bar', 'two', 'metric1') -0.301414352794
('bar', 'two', 'metric2') 0.610076176389