Python Pandas - reindeksowanie

Reindexingzmienia etykiety wierszy i kolumn DataFrame. Aby reindex środki do zgodnych danych dopasować dany zestaw etykiet wzdłuż określonej osi.

Wiele operacji można wykonać poprzez indeksowanie, takie jak -

  • Zmień kolejność istniejących danych, aby dopasować je do nowego zestawu etykiet.

  • Wstaw znaczniki brakujących wartości (NA) w lokalizacjach etykiet, w których nie było danych dla etykiety.

Przykład

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()
})

#reindex the DataFrame
df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])

print df_reindexed

Jego output wygląda następująco -

A    C     B
0  2016-01-01  Low   NaN
2  2016-01-03  High  NaN
5  2016-01-06  Low   NaN

Zindeksuj ponownie, aby wyrównać z innymi obiektami

Możesz chcieć wziąć obiekt i ponownie zindeksować jego osie, aby uzyskać taką samą etykietę jak inny obiekt. Rozważ następujący przykład, aby zrozumieć to samo.

Przykład

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])

df1 = df1.reindex_like(df2)
print df1

Jego output wygląda następująco -

col1         col2         col3
0    -2.467652    -1.211687    -0.391761
1    -0.287396     0.522350     0.562512
2    -0.255409    -0.483250     1.866258
3    -1.150467    -0.646493    -0.222462
4     0.152768    -2.056643     1.877233
5    -1.155997     1.528719    -1.343719
6    -1.015606    -1.245936    -0.295275

Note - Tutaj df1 DataFrame jest zmieniana i reindeksowana jak df2. Nazwy kolumn powinny być dopasowane, w przeciwnym razie NAN zostanie dodany do całej etykiety kolumny.

Wypełnianie podczas ponownego indeksowania

reindex() przyjmuje opcjonalną metodę parametru, która jest metodą wypełniania z następującymi wartościami -

  • pad/ffill - Wypełnij wartości do przodu

  • bfill/backfill - Wypełnij wartości wstecz

  • nearest - Wypełnij od najbliższych wartości indeksu

Przykład

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])

# Padding NAN's
print df2.reindex_like(df1)

# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill:")
print df2.reindex_like(df1,method='ffill')

Jego output wygląda następująco -

col1        col2       col3
0    1.311620   -0.707176   0.599863
1   -0.423455   -0.700265   1.133371
2         NaN         NaN        NaN
3         NaN         NaN        NaN
4         NaN         NaN        NaN
5         NaN         NaN        NaN

Data Frame with Forward Fill:
         col1        col2        col3
0    1.311620   -0.707176    0.599863
1   -0.423455   -0.700265    1.133371
2   -0.423455   -0.700265    1.133371
3   -0.423455   -0.700265    1.133371
4   -0.423455   -0.700265    1.133371
5   -0.423455   -0.700265    1.133371

Note - Ostatnie cztery rzędy są wyściełane.

Ograniczenia dotyczące wypełniania podczas ponownego indeksowania

Argument limit zapewnia dodatkową kontrolę nad wypełnianiem podczas ponownego indeksowania. Limit określa maksymalną liczbę kolejnych dopasowań. Rozważmy następujący przykład, aby zrozumieć to samo -

Przykład

import pandas as pd
import numpy as np
 
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])

# Padding NAN's
print df2.reindex_like(df1)

# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill limiting to 1:")
print df2.reindex_like(df1,method='ffill',limit=1)

Jego output wygląda następująco -

col1        col2        col3
0    0.247784    2.128727    0.702576
1   -0.055713   -0.021732   -0.174577
2         NaN         NaN         NaN
3         NaN         NaN         NaN
4         NaN         NaN         NaN
5         NaN         NaN         NaN

Data Frame with Forward Fill limiting to 1:
         col1        col2        col3
0    0.247784    2.128727    0.702576
1   -0.055713   -0.021732   -0.174577
2   -0.055713   -0.021732   -0.174577
3         NaN         NaN         NaN
4         NaN         NaN         NaN
5         NaN         NaN         NaN

Note- Zauważ, że tylko siódmy wiersz jest wypełniony przez poprzedni szósty wiersz. Następnie rzędy pozostawia się bez zmian.

Zmiana nazwy

Metoda rename () umożliwia zmianę etykiety osi na podstawie jakiegoś odwzorowania (dykt lub seria) lub dowolnej funkcji.

Rozważmy następujący przykład, aby to zrozumieć -

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
print df1

print ("After renaming the rows and columns:")
print df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},
index = {0 : 'apple', 1 : 'banana', 2 : 'durian'})

Jego output wygląda następująco -

col1        col2        col3
0    0.486791    0.105759    1.540122
1   -0.990237    1.007885   -0.217896
2   -0.483855   -1.645027   -1.194113
3   -0.122316    0.566277   -0.366028
4   -0.231524   -0.721172   -0.112007
5    0.438810    0.000225    0.435479

After renaming the rows and columns:
                c1          c2        col3
apple     0.486791    0.105759    1.540122
banana   -0.990237    1.007885   -0.217896
durian   -0.483855   -1.645027   -1.194113
3        -0.122316    0.566277   -0.366028
4        -0.231524   -0.721172   -0.112007
5         0.438810    0.000225    0.435479

Metoda rename () zapewnia rozszerzenie inplacenazwany parametr, który domyślnie ma wartość False i kopiuje podstawowe dane. Przechodzićinplace=True aby zmienić nazwę danych w miejscu.