English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Итерация Pandas

поведение базового итерирования объектов Pandas зависит от типа. При итерировании по Series оно эквивалентно массиву. Другие структуры данных (например, DataFrame и Panel) следуют грамматике, аналогичной dict, то есть итерирование по ключам объекта.

Коротко, базовая итерация (for i в объекте) produces −

Series − значение DataFrame − колонка метка Panel − item метка

Итерация DataFrame

Итерация DataFrame даст имена колонок. Давайте посмотрим на следующий пример.

 import pandas as pd
 import numpy as np
  
 N=20
 df = pd.DataFrame({
    ']A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
    ']x': np.linspace(0,stop=N-1,num=N),
    ']y': np.random.rand(N),
    ']C': np.random.choice(['Low','Medium','High'],N).tolist(),
    ']D': np.random.normal(100, 10, size=(N)).tolist()
    })
 for col in df:
    print col

Его вывод следующий

   A
 C
 D
 x
 y

Чтобы пройди строки DataFrame, можно использовать следующие функции-

iteritems() − Итерируй пары (ключ, значение) iterrows() − Пройди строки в виде пары (index,series) itertuples() − Пройди строки в виде namedtuples

iteritems()

Пройди каждую колонку в качестве ключа, а пары значений с метками в качестве ключа, а значения колонки в качестве объекта Series.

  import pandas as pd
  import numpy as np
  
  
  
 df = pd.
  DataFrame(np.
  random.randn(4,3),columns=[
  ']col1',
  ']col2',
  ']col3'])
  
 
  for ключ,значение
   в df.
  iteritems():
  
    print ключ,значение

Результат выполнения:

col1 0    0.802390
1    0.324060
2    0.256811
3    0.839186
Имя: col1, тип данных: float64
col2 0    1.624313
1   -1.033582
2    1.796663
3    1.856277
Имя: col2, тип данных: float64
col3 0   -0.022142
1                  -0.230820
2                  1.160691
3                  -0.830279
Имя: col3, тип данных: float64

可以看出, каждый столбец итерируется как значение ключ-значение в серии.

iterrows()

Итератор iterrows() возвращает итератор, который генерирует значения каждого индекса и последовательность, содержащую данные каждой строки.

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
 for row_index, row in df.iterrows():
    print row_index, row

Результат выполнения:

0    col1             1.529759
   col2                 0.762811
   col3                 -0.634691
Имя: 0, тип данных: float64
1    col1             -0.944087
   col2                 1.420919
   col3                 -0.507895
Имя: 1, тип данных: float64
 
2    col1             -0.077287
   col2                 -0.858556
   col3                 -0.663385
Имя: 2, тип данных: float64
3    col1             -1.638578
   col2                 0.059866
   col3                 0.493482
Имя: 3, тип данных: float64

Поскольку iterrows() итерирует строки, данные типа строки не сохраняются. 0,1,2 - это индексы строк, col1, col2, col3 - это индексы столбцов.

itertuples()

Метод itertuples() возвращает итератор, который генерирует命名为 кортеж для каждой строки DataFrame. Первый элемент кортежа будет соответствующим значением индекса строки, а оставшиеся значения будут значениями строки.

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
 for row in df.itertuples():
     print row

Результат выполнения:

Pandas(Индекс=0, col1=1.5297586201375899, col2=0.76281127433814944, col3=-
0.6346908238310438)
Pandas(Индекс=1, col1=-0.94408735763808649, col2=1.4209186418359423, col3=-
0.50789517967096232)
Pandas(Индекс=2, col1=-0.07728664756791935, col2=-0.85855574139699076, col3=-
0.6633852507207626)
Pandas(Index=3, col1=0.65734942534106289, col2=-0.95057710432604969,
col3=0.80344487462316527)
Внимание:Не пытайтесь изменять какие-либо объекты в итерации. Итерация используется для чтения, и итератор возвращает копию исходного объекта (вида), поэтому изменения не будут отражены в исходном объекте.
 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
 for index, row in df.iterrows():
    row['a'] = 10
 print df

Результат выполнения:

    col1       col2       col3
0  -1.739815   0.735595  -0.295589
1   0.635485   0.106803   1.527922
2  -0.939064   0.547095   0.038585
3  -1.016509  -0.116580  -0.523158

Обратите внимание, что никаких изменений не отражено.