我有一个熊猫数据帧,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对象是什么,以及如何使用它。


当前回答

您还可以进行NumPy索引,以实现更高的速度。它不是真正的迭代,但对某些应用程序来说,它比迭代好得多。

subset = row['c1'][0:5]
all = row['c1'][:]

您可能还希望将其强制转换为数组。这些索引/选择本来应该像NumPy数组一样,但我遇到了一些问题,需要转换

np.asarray(all)
imgs[:] = cv2.resize(imgs[:], (224,224) ) # Resize every image in an hdf5 file

其他回答

我正在寻找如何迭代行和列,并在这里结束:

for i, row in df.iterrows():
    for j, column in row.iteritems():
        print(column)

您应该使用df.iterrows()。虽然逐行迭代不是特别有效,因为必须创建Series对象。

为了循环数据帧中的所有行并方便地使用每行的值,可以将命名元组转换为ndarray。例如:

df = pd.DataFrame({'col1': [1, 2], 'col2': [0.1, 0.2]}, index=['a', 'b'])

在行上循环:

for row in df.itertuples(index=False, name='Pandas'):
    print np.asarray(row)

结果是:

[ 1.   0.1]
[ 2.   0.2]

请注意,如果index=True,则将索引添加为元组的第一个元素,这对于某些应用程序来说可能是不可取的。

有一种方法可以在返回DataFrame而不是Series时迭代抛出行。我没有看到任何人提到可以将索引作为列表传递给要作为DataFrame返回的行:

for i in range(len(df)):
    row = df.iloc[[i]]

注意双括号的用法。这将返回具有单行的DataFrame。

最简单的方法是使用apply函数

def print_row(row):
   print row['c1'], row['c2']

df.apply(lambda row: print_row(row), axis=1)