pandas迭代操作
對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是不必要的,可以採用以下手段避免。
永遠不要修改迭代的內容。不能保證在所有情況下都能正常工作。 根據數據類型,迭代器將返回副本而不是視圖,並且對其進行寫入將無效
在以下例子中,寫出將無效:
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)時,將返回常規元組。