假设我有一个(可能是多索引的,但可能不是)数据帧。例如:
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
我才会感兴趣。
答案 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