我有一个熊猫数据帧,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
首先考虑是否真的需要迭代DataFrame中的行。请参阅此答案以了解备选方案。
如果仍然需要迭代行,可以使用以下方法。请注意其他答案中未提及的一些重要注意事项。
DataFrame.iterrows()对于索引,df.iterrows()中的行:打印(行[“c1”],行[“c2”])DataFrame.itertuples()对于df.itertuples中的行(索引=True,名称=“标准”):打印(第c1行,第c2行)
itertples()应该比iterrows()快
但请注意,根据文件(熊猫目前为0.24.2):
iterrows:dtype可能在行与行之间不匹配
因为iterrows为每一行返回一个Series,所以它不会跨行保留数据类型(数据帧的数据类型跨列保留)。为了在遍历行时保留数据类型,最好使用itertples(),它返回值的namedtuples,通常比iterrows()快得多
iterrows:不修改行
您不应该修改正在迭代的内容。这并不能保证在所有情况下都有效。根据数据类型的不同,迭代器返回的是副本而不是视图,写入它不会产生任何影响。
请改用DataFrame.apply():
new_df = df.apply(lambda x: x * 2, axis = 1)
迭代:
如果列名是无效的Python标识符、重复或以下划线开头,则将重命名为位置名。对于大量列(>255),将返回常规元组。
有关详细信息,请参阅panda迭代文档。
在Pandas数据帧中有很多方法可以迭代行。一种非常简单直观的方法是:
df = pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 6], 'C':[7, 8, 9]})
print(df)
for i in range(df.shape[0]):
# For printing the second column
print(df.iloc[i, 1])
# For printing more than one columns
print(df.iloc[i, [0, 2]])