pandas迭代操作

文章目录

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)时,将返回常规元组。