pandas迭代

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是不必要的,可以採用以下手段避免。

  • 需要向量化的解決方案:許多操作可以通過使用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)時,將返回常規元組。

發佈了88 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章