按索引迭代DataFrame

22

我有一个名为staticData的数据框,长这样:

                         narrow_sector       broad_sector country exchange  \
unique_id                                                                    
BBG.MTAA.STM.S          Semiconductors         Technology      CH     MTAA   
BBG.MTAA.CNHI.S  Machinery-Diversified         Industrial      GB     MTAA   
BBG.MTAA.FCA.S      Auto Manufacturers  Consumer Cyclical      GB     MTAA   
BBG.MTAA.A2A.S                Electric          Utilities      IT     MTAA   
BBG.MTAA.ACE.S                Electric          Utilities      IT     MTAA 

我想逐行遍历数据框,并挑选出唯一标识符(unique_id)和交易所这两个信息。但是在遍历唯一标识符时遇到了问题,请看我的代码:

for i, row in staticData.iterrows():
        
    unique_id = staticData.ix[i]

    exchange = row['exchange']

我尝试过unique_id = row['unique_id'],但无法使其工作...

我正在尝试返回行1的值。

unique_id = BBG.MTAA.STM.S
exchange = MTAA 
3个回答

29
你希望以下内容:
for i, row in staticData.iterrows():
    unique_id = i
    exchange = row['exchange']
我将成为索引标签值。
示例:
In [57]:
df = pd.DataFrame(np.random.randn(5,3), index=list('abcde'), columns=list('fgh'))
df

Out[57]:
          f         g         h
a -0.900835 -0.913989 -0.624536
b -0.854091  0.286364 -0.869539
c  1.090133 -0.771667  1.258372
d -0.721753 -0.329211  0.479295
e  0.520786  0.273722  0.824172

In [62]:
for i, row in df.iterrows():
    print('index: ', i, 'col g:', row['g'])

index:  a col g: -0.913988608754
index:  b col g: 0.286363847188
index:  c col g: -0.771666520074
index:  d col g: -0.329211394286
index:  e col g: 0.273721527592

9

也许有更“熊猫式”的方式?

staticData.apply((lambda x: (x.name, x['exchange'])), axis=1)

我们可以使用apply方法获取行的索引吗? - Varun Suresh Kumar

1
首先,遍历数据框架是一种反模式,因为在99%的情况下,有一种向量化的方法更有效地完成您要执行的任务。话虽如此,如果必须循环,某些方法比其他方法更有效。
要遍历特定列,请使用items()
for idx, value in df['exchange'].items():
    # do something

要遍历数据框,请使用itertuples()

# e.g. to access the `exchange` values as in the OP
for idx, *row in df.itertuples():
    print(idx, row.exchange)

items() 从一个序列创建一个zip对象,而itertuples()创建了命名元组,您可以通过列名引用特定的值。

itertuplesiterrows 快得多。例如,对于一个有50000行的框架,iterrows 需要2.4秒来循环遍历每一行,而itertuples 只需要62毫秒(大约快40倍)。由于这是一个循环,这个差异是恒定的,如果您的数据框更大,我们将看到几秒钟与几分钟之间的差异。

df = pd.concat([df]*10000, ignore_index=True)

%timeit list(df.itertuples())
# 62 ms ± 11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit list(df.iterrows())
# 2.42 s ± 162 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接