我有一个熊猫数据帧,df:

   c1   c2
0  10  100
1  11  110
2  12  120

如何迭代此数据帧的行?对于每一行,我希望能够通过列的名称访问其元素(单元格中的值)。例如:

for row in df.rows:
    print(row['c1'], row['c2'])

我发现了一个类似的问题,建议使用以下任一项:

for date, row in df.T.iteritems():
for row in df.iterrows():

但我不知道row对象是什么,以及如何使用它。


当前回答

iterrows()返回元组(a,b),其中a是索引,b是行。

其他回答

iterrows()返回元组(a,b),其中a是索引,b是行。

虽然iterrows()是一个很好的选项,但有时itertples()会快得多:

df = pd.DataFrame({'a': randn(1000), 'b': randn(1000),'N': randint(100, 1000, (1000)), 'x': 'x'})

%timeit [row.a * 2 for idx, row in df.iterrows()]
# => 10 loops, best of 3: 50.3 ms per loop

%timeit [row[1] * 2 for row in df.itertuples()]
# => 1000 loops, best of 3: 541 µs per loop

正如公认的答案所述,在行上应用函数的最快方法是使用矢量化函数,即所谓的NumPy-ufuncs(通用函数)。

但是,当您要应用的函数尚未在NumPy中实现时,应该怎么做?

好吧,使用numba的矢量化装饰器,您可以轻松地直接在Python中创建ufunc,如下所示:

from numba import vectorize, float64

@vectorize([float64(float64)])
def f(x):
    #x is your line, do something with it, and return a float

此函数的文档如下:创建NumPy通用函数

可能是最优雅的解决方案(但肯定不是最有效的):

for row in df.values:
    c2 = row[1]
    print(row)
    # ...

for c1, c2 in df.values:
    # ...

注意:

文档明确建议改用.to_numpy()在最坏的情况下,生成的NumPy数组将具有适合所有列的dtype对象首先有充分的理由不使用循环

尽管如此,我认为这个选项应该包含在这里,作为一个(人们应该认为)微不足道的问题的直接解决方案。

您还可以使用df.apply()来迭代行并访问函数的多个列。

docs:DataFrame.apply()

def valuation_formula(x, y):
    return x * y * 0.5

df['price'] = df.apply(lambda row: valuation_formula(row['x'], row['y']), axis=1)