pandas迭代操作
- items
- iterrows
- itertuples
对pandas对象进行基本迭代的行为取决于类型。
当迭代Serives时,它被当作array-like,基础迭代产生值。
DataFrame遵循类似dict的约定,即在对象的“键”上进行迭代。
使用基础迭代(for i in object)将产生:
- Series: 值
- DataFrame: columns标签
如下例子中:迭代DataFrame将给出columns名字:
import numpy as np
import pandas as pd
df=pd.DataFrame({'col1':np.random.randn(3),
'col2':np.random.randn(3)},
index=['a','b','c'])
for col in df:
print(col)
col1
col2
panda对象还具有类似于字典的items()方法,用于遍历(key,value)对。
要遍历DataFrame的行,可以使用以下方法:
- iterrows():遍历DataFrame的行作为 (index, Series)对。它将行转换为Series对象,这会更改dtype并具有一些性能影响。
- itertuples(): 便历DataFrame的行,并将行转为元组。这比iterrows()快很多,并且在大多数情况下,最好使用它遍历DataFrame的值。
迭代pandas对象速度很慢。一般情况下手动遍历rows是不必要的,可以采用以下手段避免。
- 需要向量化的解决方案:许多操作可以通过使用python内置方法或者numpy函数来解决。
- 当您的函数不能一次处理整个DataFrame/Series时,最好使用apply()而不是遍历这些值。
- 如果需要对值进行迭代操作,但是性能很重要,考虑使用cython或numba编写内部循环。 有关此方法的一些示例,请参见增强性能部分。
永远不要修改迭代的内容。不能保证在所有情况下都能正常工作。 根据数据类型,迭代器将返回副本而不是视图,并且对其进行写入将无效
在以下例子中,写出将无效:
df = pd.DataFrame({'a':[1,2,3],
'b':['a','b','c']})
for index,row in df.iterrows():
row['a'] = 10
df
a | b | |
0 | 1 | a |
1 | 2 | b |
2 | 3 | c |
items
与类似于dict的接口一致,items()通过键-值对进行迭代:
- Series: (index,scalar value)
- DataFrame: (column,Series)
for label, ser in df.items():
print(label)
print(ser)
a
0 1
1 2
2 3
Name: a, dtype: int64
b
0 a
1 b
2 c
Name: b, dtype: object
iterrows
iterrows()遍历DataFrame的行。它返回一个迭代器,产生每个索引值以及一个包含每行数据的Series:
for row_index,row in df.iterrows():
print(row_index,row,sep='\n')
0
a 1
b a
Name: 0, dtype: object
1
a 2
b b
Name: 1, dtype: object
2
a 3
b c
Name: 2, dtype: object
因为iterrows()为每一行返回一个Series,所以它不会在各行中保留dtypes(dtypes在DataFrames的各列中都保留)。
例如:
df_orig = pd.DataFrame([[1, 1.5]], columns=['int', 'float'])
df_orig.dtypes
int int64
float float64
dtype: object
row = next(df_orig.iterrows())[1]
row
int 1.0
float 1.5
Name: 0, dtype: float64
将行中作为系列返回的所有值向上转换为浮点数,也将x列中的原始整数值转换为浮点数:
row['int'].dtype
dtype('float64')
df_orig['int'].dtype
dtype('int64')
使用itertuples()它返回元组。并且比iterrows()快的多。
手动方法转置
df2 = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
print(df2)
x y
0 1 4
1 2 5
2 3 6
print(df.T)
0 1 2
a 1 2 3
b a b c
df2_t = pd.DataFrame({idx:value for idx,value in df2.iterrows()})
print(df2_t)
0 1 2
x 1 2 3
y 4 5 6
itertuples
itertuples()方法将返回一个迭代器,该迭代器为DataFrame中的每一行生成一个namedtuple。tuple的第一个元素是行对应的索引值,其余的值是行值。
for row in df.itertuples():
print(row)
Pandas(Index=0, a=1, b='a')
Pandas(Index=1, a=2, b='b')
Pandas(Index=2, a=3, b='c')
此方法不会将行转换为Series对象。 它只返回一个namedtuple内部的值。 因此,itertuples()会保留值的数据类型,并且通常会更快。
如果列名是无效的Python标识符(重复出现或以下划线开头),则列名将重命名为位置名。 具有大量列(> 255)时,将返回常规元组。