Post

02- Pandas Kütüphanesi

Pandas kutuphanesi verileri pratik bir şekilde görselleştirmede kullandığımız kütüphanedir.

02- Pandas Kütüphanesi

Pandas 10 dakika

Bu, esas olarak yeni kullanıcılar için tasarlanmış pandalara kısa bir giriş niteliğindedir. Daha karmaşık tarifleri görebilirsiniz. Yemek kitabı.

Genellikle, aşağıdaki gibi içe aktarırız:

1
2
3
In [1]: import numpy as np

In [2]: import pandas as pd

Pandalarda temel veri yapıları

Pandas, verileri işlemek için iki tür sınıf sağlar:

  1. Series: her tür veriyi tutan tek boyutlu etiketli dizi

tamsayılar, dizeler, Python nesneleri vb.

  1. DataFrame: verileri tutan iki boyutlu bir veri yapısı iki boyutlu bir dizi veya satır ve sütun içeren bir tablo.

Nesne oluşturma

Görmek Veri yapıları bölümüne giriş.

Bir Oluşturma Series bir değer listesi geçirerek pandaların yaratılmasına izin vererek varsayılan RangeIndex.

1
2
3
4
5
6
7
8
9
10
11
In [3]: s = pd.Series([1, 3, 5, np.nan, 6, 8])

In [4]: s
Out[4]: 
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

Bir Oluşturma DataFrame datetime dizinine sahip bir NumPy dizisini kullanarak date_range() ve etiketli sütunlar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [5]: dates = pd.date_range("20130101", periods=6)

In [6]: dates
Out[6]: 
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')

In [7]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD"))

In [8]: df
Out[8]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

Bir Oluşturma DataFrame anahtarların sütun olduğu nesnelerin sözlüğünü geçirerek etiketler ve değerler sütun değerleridir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [9]: df2 = pd.DataFrame(
   ...:     {
   ...:         "A": 1.0,
   ...:         "B": pd.Timestamp("20130102"),
   ...:         "C": pd.Series(1, index=list(range(4)), dtype="float32"),
   ...:         "D": np.array([3] * 4, dtype="int32"),
   ...:         "E": pd.Categorical(["test", "train", "test", "train"]),
   ...:         "F": "foo",
   ...:     }
   ...: )
   ...: 

In [10]: df2
Out[10]: 
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo

Ortaya çıkan sütunlar DataFrame farklı dtypes:

1
2
3
4
5
6
7
8
9
In [11]: df2.dtypes
Out[11]: 
A          float64
B    datetime64[s]
C          float32
D            int32
E         category
F           object
dtype: object

IPython kullanıyorsanız, sütun adları (ve genel) için sekme tamamlama öznitelikler) otomatik olarak etkinleştirilir. İşte özelliklerin bir alt kümesi tamamlanacak:

1
2
3
4
5
6
7
8
9
10
11
12
13
In [12]: df2.<TAB>  # noqa: E225, E999
df2.A                  df2.bool
df2.abs                df2.boxplot
df2.add                df2.C
df2.add_prefix         df2.clip
df2.add_suffix         df2.columns
df2.align              df2.copy
df2.all                df2.count
df2.any                df2.combine
df2.append             df2.D
df2.apply              df2.describe
df2.applymap           df2.diff
df2.B                  df2.duplicated

Gördüğünüz gibi sütunlar A, B, C, ve D otomatik olarak sekme tamamlandı. E ve F orada da var mı; diğer özellikler kısalık için kesilmiş.

Verileri görüntüleme

Görmek Temel olarak işlevsellik bölümü.

Kullanmak DataFrame.head() ve DataFrame.tail() çerçevenin üst ve alt sıralarını görüntülemek için sırasıyla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [13]: df.head()
Out[13]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401

In [14]: df.tail(3)
Out[14]: 
                   A         B         C         D
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

Görüntüleme DataFrame.index veya DataFrame.columns:

1
2
3
4
5
6
7
8
In [15]: df.index
Out[15]: 
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')

In [16]: df.columns
Out[16]: Index(['A', 'B', 'C', 'D'], dtype='object')

Temel verilerin bir NumPy temsilini DataFrame.to_numpy() dizin veya sütun etiketleri olmadan:

1
2
3
4
5
6
7
8
In [17]: df.to_numpy()
Out[17]: 
array([[ 0.4691, -0.2829, -1.5091, -1.1356],
       [ 1.2121, -0.1732,  0.1192, -1.0442],
       [-0.8618, -2.1046, -0.4949,  1.0718],
       [ 0.7216, -0.7068, -1.0396,  0.2719],
       [-0.425 ,  0.567 ,  0.2762, -1.0874],
       [-0.6737,  0.1136, -1.4784,  0.525 ]])

Not

Pandalar DataFrames iken NumPy dizileri tüm dizi için bir dtype’a sahiptir sütun başına bir dtype’a sahip. Aradığın zaman DataFrame.to_numpy(), pandalar olacak tutabilecek NumPy dtype’ını bulun hepsi DataFrame içindeki dtypes. Ortak veri türü object, DataFrame.to_numpy() gerektirecek veri kopyalama.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
In [18]: df2.dtypes
Out[18]: 
A          float64
B    datetime64[s]
C          float32
D            int32
E         category
F           object
dtype: object

In [19]: df2.to_numpy()
Out[19]: 
array([[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo']],
      dtype=object)

describe()verilerinizin hızlı bir istatistik özetini gösterir:

1
2
3
4
5
6
7
8
9
10
11
In [20]: df.describe()
Out[20]: 
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.073711 -0.431125 -0.687758 -0.233103
std    0.843157  0.922818  0.779887  0.973118
min   -0.861849 -2.104569 -1.509059 -1.135632
25%   -0.611510 -0.600794 -1.368714 -1.076610
50%    0.022070 -0.228039 -0.767252 -0.386188
75%    0.658444  0.041933 -0.034326  0.461706
max    1.212112  0.567020  0.276232  1.071804

Verilerinizi aktarma:

1
2
3
4
5
6
7
In [21]: df.T
Out[21]: 
   2013-01-01  2013-01-02  2013-01-03  2013-01-04  2013-01-05  2013-01-06
A    0.469112    1.212112   -0.861849    0.721555   -0.424972   -0.673690
B   -0.282863   -0.173215   -2.104569   -0.706771    0.567020    0.113648
C   -1.509059    0.119209   -0.494929   -1.039575    0.276232   -1.478427
D   -1.135632   -1.044236    1.071804    0.271860   -1.087401    0.524988

DataFrame.sort_index()bir eksene göre sıralar:

1
2
3
4
5
6
7
8
9
In [22]: df.sort_index(axis=1, ascending=False)
Out[22]: 
                   D         C         B         A
2013-01-01 -1.135632 -1.509059 -0.282863  0.469112
2013-01-02 -1.044236  0.119209 -0.173215  1.212112
2013-01-03  1.071804 -0.494929 -2.104569 -0.861849
2013-01-04  0.271860 -1.039575 -0.706771  0.721555
2013-01-05 -1.087401  0.276232  0.567020 -0.424972
2013-01-06  0.524988 -1.478427  0.113648 -0.673690

DataFrame.sort_values()değerlere göre sıralar:

1
2
3
4
5
6
7
8
9
In [23]: df.sort_values(by="B")
Out[23]: 
                   A         B         C         D
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-06 -0.673690  0.113648 -1.478427  0.524988
2013-01-05 -0.424972  0.567020  0.276232 -1.087401

seçim

Dizin oluşturma belgelerine bakın Dizin Oluşturma ve Veri Seçme ve MultiIndex / Gelişmiş Dizin Oluşturma.

Getitem ([])

İçin DataFrametek bir etiketin geçmesi bir sütun seçer ve bir Series eşdeğer df.A:

1
2
3
4
5
6
7
8
9
In [24]: df["A"]
Out[24]: 
2013-01-01    0.469112
2013-01-02    1.212112
2013-01-03   -0.861849
2013-01-04    0.721555
2013-01-05   -0.424972
2013-01-06   -0.673690
Freq: D, Name: A, dtype: float64

İçin DataFrame, bir dilim geçiyor : eşleşen satırları seçer:

1
2
3
4
5
6
7
8
9
10
11
12
13
In [25]: df[0:3]
Out[25]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804

In [26]: df["20130102":"20130104"]
Out[26]: 
                   A         B         C         D
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860

Etikete göre seçim

Daha fazlasını görmek Etikete Göre Seçim kullanarak DataFrame.loc() veya DataFrame.at().

Bir etiketle eşleşen bir satır seçme:

1
2
3
4
5
6
7
In [27]: df.loc[dates[0]]
Out[27]: 
A    0.469112
B   -0.282863
C   -1.509059
D   -1.135632
Name: 2013-01-01 00:00:00, dtype: float64

Tüm satırları seçme (:) belirli bir sütun etiketi ile:

1
2
3
4
5
6
7
8
9
In [28]: df.loc[:, ["A", "B"]]
Out[28]: 
                   A         B
2013-01-01  0.469112 -0.282863
2013-01-02  1.212112 -0.173215
2013-01-03 -0.861849 -2.104569
2013-01-04  0.721555 -0.706771
2013-01-05 -0.424972  0.567020
2013-01-06 -0.673690  0.113648

Etiket dilimleme için her iki uç nokta dahil:

1
2
3
4
5
6
In [29]: df.loc["20130102":"20130104", ["A", "B"]]
Out[29]: 
                   A         B
2013-01-02  1.212112 -0.173215
2013-01-03 -0.861849 -2.104569
2013-01-04  0.721555 -0.706771

Tek bir satır ve sütun etiketi seçmek bir skaler döndürür:

1
2
In [30]: df.loc[dates[0], "A"]
Out[30]: 0.4691122999071863

Bir skalere hızlı erişim elde etmek için (önceki yönteme eşdeğer):

1
2
In [31]: df.at[dates[0], "A"]
Out[31]: 0.4691122999071863

Konuma göre seçim

Daha fazlasını görmek Konuma Göre Seçim kullanarak DataFrame.iloc() veya DataFrame.iat().

Geçen tamsayıların konumu üzerinden seçim yapın:

1
2
3
4
5
6
7
In [32]: df.iloc[3]
Out[32]: 
A    0.721555
B   -0.706771
C   -1.039575
D    0.271860
Name: 2013-01-04 00:00:00, dtype: float64

Tamsayı dilimleri NumPy / Python’a benzer:

1
2
3
4
5
In [33]: df.iloc[3:5, 0:2]
Out[33]: 
                   A         B
2013-01-04  0.721555 -0.706771
2013-01-05 -0.424972  0.567020

Tamsayı konum konum konumlarının listesi:

1
2
3
4
5
6
In [34]: df.iloc[[1, 2, 4], [0, 2]]
Out[34]: 
                   A         C
2013-01-02  1.212112  0.119209
2013-01-03 -0.861849 -0.494929
2013-01-05 -0.424972  0.276232

Satırları açıkça dilimlemek için:

1
2
3
4
5
In [35]: df.iloc[1:3, :]
Out[35]: 
                   A         B         C         D
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804

Sütunları açıkça dilimlemek için:

1
2
3
4
5
6
7
8
9
In [36]: df.iloc[:, 1:3]
Out[36]: 
                   B         C
2013-01-01 -0.282863 -1.509059
2013-01-02 -0.173215  0.119209
2013-01-03 -2.104569 -0.494929
2013-01-04 -0.706771 -1.039575
2013-01-05  0.567020  0.276232
2013-01-06  0.113648 -1.478427

Açıkça bir değer elde etmek için:

1
2
In [37]: df.iloc[1, 1]
Out[37]: -0.17321464905330858

Bir skalere hızlı erişim elde etmek için (önceki yönteme eşdeğer):

1
2
In [38]: df.iat[1, 1]
Out[38]: -0.17321464905330858

Boole indeksleme

Nerede satır seçin df.A daha büyük 0.

1
2
3
4
5
6
In [39]: df[df["A"] > 0]
Out[39]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-04  0.721555 -0.706771 -1.039575  0.271860

Bir değerden seçim yapma DataFrame bir boole durumunun karşılandığı yer:

1
2
3
4
5
6
7
8
9
In [40]: df[df > 0]
Out[40]: 
                   A         B         C         D
2013-01-01  0.469112       NaN       NaN       NaN
2013-01-02  1.212112       NaN  0.119209       NaN
2013-01-03       NaN       NaN       NaN  1.071804
2013-01-04  0.721555       NaN       NaN  0.271860
2013-01-05       NaN  0.567020  0.276232       NaN
2013-01-06       NaN  0.113648       NaN  0.524988

kullanarak isin() filtreleme yöntemi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [41]: df2 = df.copy()

In [42]: df2["E"] = ["one", "one", "two", "three", "four", "three"]

In [43]: df2
Out[43]: 
                   A         B         C         D      E
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632    one
2013-01-02  1.212112 -0.173215  0.119209 -1.044236    one
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804    two
2013-01-04  0.721555 -0.706771 -1.039575  0.271860  three
2013-01-05 -0.424972  0.567020  0.276232 -1.087401   four
2013-01-06 -0.673690  0.113648 -1.478427  0.524988  three

In [44]: df2[df2["E"].isin(["two", "four"])]
Out[44]: 
                   A         B         C         D     E
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804   two
2013-01-05 -0.424972  0.567020  0.276232 -1.087401  four

Ayarlama

Yeni bir sütun ayarlamak, verileri dizinlere göre otomatik olarak hizalar:

1
2
3
4
5
6
7
8
9
10
11
12
13
In [45]: s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range("20130102", periods=6))

In [46]: s1
Out[46]: 
2013-01-02    1
2013-01-03    2
2013-01-04    3
2013-01-05    4
2013-01-06    5
2013-01-07    6
Freq: D, dtype: int64

In [47]: df["F"] = s1

Değerleri etikete göre ayarlama:

1
In [48]: df.at[dates[0], "A"] = 0

Değerleri konuma göre ayarlama:

1
In [49]: df.iat[0, 1] = 0

NumPy dizisiyle atayarak ayarlama:

1
In [50]: df.loc[:, "D"] = np.array([5] * len(df))

Önceki ayar işlemlerinin sonucu:

1
2
3
4
5
6
7
8
9
In [51]: df
Out[51]: 
                   A         B         C    D    F
2013-01-01  0.000000  0.000000 -1.509059  5.0  NaN
2013-01-02  1.212112 -0.173215  0.119209  5.0  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5.0  2.0
2013-01-04  0.721555 -0.706771 -1.039575  5.0  3.0
2013-01-05 -0.424972  0.567020  0.276232  5.0  4.0
2013-01-06 -0.673690  0.113648 -1.478427  5.0  5.0

A where ayarlı çalışma:

1
2
3
4
5
6
7
8
9
10
11
12
13
In [52]: df2 = df.copy()

In [53]: df2[df2 > 0] = -df2

In [54]: df2
Out[54]: 
                   A         B         C    D    F
2013-01-01  0.000000  0.000000 -1.509059 -5.0  NaN
2013-01-02 -1.212112 -0.173215 -0.119209 -5.0 -1.0
2013-01-03 -0.861849 -2.104569 -0.494929 -5.0 -2.0
2013-01-04 -0.721555 -0.706771 -1.039575 -5.0 -3.0
2013-01-05 -0.424972 -0.567020 -0.276232 -5.0 -4.0
2013-01-06 -0.673690 -0.113648 -1.478427 -5.0 -5.0

Eksik veriler

NumPy veri türleri için, np.nan eksik verileri temsil eder. Tarafından varsayılan hesaplamalara dahil değildir. Görmek Eksik Veri bölümü.

Yeniden dizine ekleme, belirli bir eksendeki dizini değiştirmenize / eklemenize / silmenize olanak tanır. Bu verilerin bir kopyasını döndürür:

1
2
3
4
5
6
7
8
9
10
11
In [55]: df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ["E"])

In [56]: df1.loc[dates[0] : dates[1], "E"] = 1

In [57]: df1
Out[57]: 
                   A         B         C    D    F    E
2013-01-01  0.000000  0.000000 -1.509059  5.0  NaN  1.0
2013-01-02  1.212112 -0.173215  0.119209  5.0  1.0  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5.0  2.0  NaN
2013-01-04  0.721555 -0.706771 -1.039575  5.0  3.0  NaN

DataFrame.dropna()veri eksik olan satırları bırakır:

1
2
3
4
In [58]: df1.dropna(how="any")
Out[58]: 
                   A         B         C    D    F    E
2013-01-02  1.212112 -0.173215  0.119209  5.0  1.0  1.0

DataFrame.fillna()eksik verileri doldurur:

1
2
3
4
5
6
7
In [59]: df1.fillna(value=5)
Out[59]: 
                   A         B         C    D    F    E
2013-01-01  0.000000  0.000000 -1.509059  5.0  5.0  1.0
2013-01-02  1.212112 -0.173215  0.119209  5.0  1.0  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5.0  2.0  5.0
2013-01-04  0.721555 -0.706771 -1.039575  5.0  3.0  5.0

isna() değerlerin olduğu yerde boole maskesini alır nan:

1
2
3
4
5
6
7
In [60]: pd.isna(df1)
Out[60]: 
                A      B      C      D      F      E
2013-01-01  False  False  False  False   True  False
2013-01-02  False  False  False  False  False  False
2013-01-03  False  False  False  False  False   True
2013-01-04  False  False  False  False  False   True

operasyonlar

Görmek İkili Ops hakkında temel bölüm.

İstatistikler

Genel olarak operasyonlar hariç eksik veri.

Her sütun için ortalama değeri hesaplayın:

1
2
3
4
5
6
7
8
In [61]: df.mean()
Out[61]: 
A   -0.004474
B   -0.383981
C   -0.687758
D    5.000000
F    3.000000
dtype: float64

Her satır için ortalama değeri hesaplayın:

1
2
3
4
5
6
7
8
9
In [62]: df.mean(axis=1)
Out[62]: 
2013-01-01    0.872735
2013-01-02    1.431621
2013-01-03    0.707731
2013-01-04    1.395042
2013-01-05    1.883656
2013-01-06    1.592306
Freq: D, dtype: float64

Başka biriyle çalışma Series veya DataFrame farklı bir dizin veya sütunla sonucu dizin veya sütun etiketlerinin birleşimi ile hizalar. Ayrıca pandalar belirtilen boyut boyunca otomatik olarak yayın yapar ve hizalanmamış etiketleri np.nan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
In [63]: s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)

In [64]: s
Out[64]: 
2013-01-01    NaN
2013-01-02    NaN
2013-01-03    1.0
2013-01-04    3.0
2013-01-05    5.0
2013-01-06    NaN
Freq: D, dtype: float64

In [65]: df.sub(s, axis="index")
Out[65]: 
                   A         B         C    D    F
2013-01-01       NaN       NaN       NaN  NaN  NaN
2013-01-02       NaN       NaN       NaN  NaN  NaN
2013-01-03 -1.861849 -3.104569 -1.494929  4.0  1.0
2013-01-04 -2.278445 -3.706771 -4.039575  2.0  0.0
2013-01-05 -5.424972 -4.432980 -4.723768  0.0 -1.0
2013-01-06       NaN       NaN       NaN  NaN  NaN

Kullanıcı tanımlı işlevler

DataFrame.agg() ve DataFrame.transform() kullanıcı tanımlı bir işlev uygular sonucunu sırasıyla azaltır veya yayınlar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
In [66]: df.agg(lambda x: np.mean(x) * 5.6)
Out[66]: 
A    -0.025054
B    -2.150294
C    -3.851445
D    28.000000
F    16.800000
dtype: float64

In [67]: df.transform(lambda x: x * 101.2)
Out[67]: 
                     A           B           C      D      F
2013-01-01    0.000000    0.000000 -152.716721  506.0    NaN
2013-01-02  122.665737  -17.529322   12.063922  506.0  101.2
2013-01-03  -87.219115 -212.982405  -50.086843  506.0  202.4
2013-01-04   73.021382  -71.525239 -105.204988  506.0  303.6
2013-01-05  -43.007200   57.382459   27.954680  506.0  404.8
2013-01-06  -68.177398   11.501219 -149.616767  506.0  506.0

Değer Sayıları

Daha fazlasını görmek için Histogramlama ve Ayrıklaştırma.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
In [68]: s = pd.Series(np.random.randint(0, 7, size=10))

In [69]: s
Out[69]: 
0    4
1    2
2    1
3    2
4    6
5    4
6    4
7    6
8    4
9    4
dtype: int64

In [70]: s.value_counts()
Out[70]: 
4    5
2    2
6    2
1    1
Name: count, dtype: int64

Dize Yöntemleri

Series bir dizi dize işleme yöntemi ile donatılmıştır. str dizinin her öğesinde, kod snippet aşağıda. Daha fazlasını görmek için Vektörleştirilmiş Dize Yöntemleri.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
In [71]: s = pd.Series(["A", "B", "C", "Aaba", "Baca", np.nan, "CABA", "dog", "cat"])

In [72]: s.str.lower()
Out[72]: 
0       a
1       b
2       c
3    aaba
4    baca
5     NaN
6    caba
7     dog
8     cat
dtype: object

Birleştirmek

concat

pandalar kolayca bir araya gelmek için çeşitli olanaklar sunar Series ve DataFrame dizinler için çeşitli ayar mantığına sahip nesneler ve birleştirme / birleştirme türü durumunda ilişkisel cebir işlevselliği operasyonlar.

Görmek Birleştirme bölümü.

Birleştirici panda nesneleri ile birlikte satır olarak concat():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
In [73]: df = pd.DataFrame(np.random.randn(10, 4))

In [74]: df
Out[74]: 
          0         1         2         3
0 -0.548702  1.467327 -1.015962 -0.483075
1  1.637550 -1.217659 -0.291519 -1.745505
2 -0.263952  0.991460 -0.919069  0.266046
3 -0.709661  1.669052  1.037882 -1.705775
4 -0.919854 -0.042379  1.247642 -0.009920
5  0.290213  0.495767  0.362949  1.548106
6 -1.131345 -0.089329  0.337863 -0.945867
7 -0.932132  1.956030  0.017587 -0.016692
8 -0.575247  0.254161 -1.143704  0.215897
9  1.193555 -0.077118 -0.408530 -0.862495

# break it into pieces
In [75]: pieces = [df[:3], df[3:7], df[7:]]

In [76]: pd.concat(pieces)
Out[76]: 
          0         1         2         3
0 -0.548702  1.467327 -1.015962 -0.483075
1  1.637550 -1.217659 -0.291519 -1.745505
2 -0.263952  0.991460 -0.919069  0.266046
3 -0.709661  1.669052  1.037882 -1.705775
4 -0.919854 -0.042379  1.247642 -0.009920
5  0.290213  0.495767  0.362949  1.548106
6 -1.131345 -0.089329  0.337863 -0.945867
7 -0.932132  1.956030  0.017587 -0.016692
8 -0.575247  0.254161 -1.143704  0.215897
9  1.193555 -0.077118 -0.408530 -0.862495

Not

Sütuna ekleme DataFrame nispeten hızlıdır. Ancak, bir satır bir kopya gerektirir ve pahalı olabilir. Geçmenizi öneririz önceden oluşturulmuş kayıt listesi DataFrame bunun yerine yapıcı bina a DataFrame kayıtları yinelemeli olarak ekleyerek.

Katıl

merge() belirli sütunlar boyunca SQL stili birleştirme türlerini etkinleştirir. Görmek Veritabanı stili birleştirme Bölüm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
In [77]: left = pd.DataFrame({"key": ["foo", "foo"], "lval": [1, 2]})

In [78]: right = pd.DataFrame({"key": ["foo", "foo"], "rval": [4, 5]})

In [79]: left
Out[79]: 
   key  lval
0  foo     1
1  foo     2

In [80]: right
Out[80]: 
   key  rval
0  foo     4
1  foo     5

In [81]: pd.merge(left, right, on="key")
Out[81]: 
   key  lval  rval
0  foo     1     4
1  foo     1     5
2  foo     2     4
3  foo     2     5

merge()benzersiz tuşlarda:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
In [82]: left = pd.DataFrame({"key": ["foo", "bar"], "lval": [1, 2]})

In [83]: right = pd.DataFrame({"key": ["foo", "bar"], "rval": [4, 5]})

In [84]: left
Out[84]: 
   key  lval
0  foo     1
1  bar     2

In [85]: right
Out[85]: 
   key  rval
0  foo     4
1  bar     5

In [86]: pd.merge(left, right, on="key")
Out[86]: 
   key  lval  rval
0  foo     1     4
1  bar     2     5

gruplama

“grubuna göre ” ile, aşağıdakilerden bir veya daha fazlasını içeren bir işleme atıfta bulunuyoruz. aşağıdaki adımlar:

  • bölme bazı kriterlere göre veriler gruplara ayrılır
  • Uygulama her gruba bağımsız olarak bir işlev
  • birleştirme sonuçlar bir veri yapısına dönüştürülür

Görmek Gruplama bölümü.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
In [87]: df = pd.DataFrame(
   ....:     {
   ....:         "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
   ....:         "B": ["one", "one", "two", "three", "two", "two", "one", "three"],
   ....:         "C": np.random.randn(8),
   ....:         "D": np.random.randn(8),
   ....:     }
   ....: )
   ....: 

In [88]: df
Out[88]: 
     A      B         C         D
0  foo    one  1.346061 -1.577585
1  bar    one  1.511763  0.396823
2  foo    two  1.627081 -0.105381
3  bar  three -0.990582 -0.532532
4  foo    two -0.441652  1.453749
5  bar    two  1.211526  1.208843
6  foo    one  0.268520 -0.080952
7  foo  three  0.024580 -0.264610

Bir sütun etiketine göre gruplama, sütun etiketlerini seçme ve ardından DataFrameGroupBy.sum() sonuçta ortaya çıkan fonksiyon gruplar:

1
2
3
4
5
6
In [89]: df.groupby("A")[["C", "D"]].sum()
Out[89]: 
            C         D
A                      
bar  1.732707  1.073134
foo  2.824590 -0.574779

Birden çok sütun etiket formuna göre gruplandırma MultiIndex.

1
2
3
4
5
6
7
8
9
10
In [90]: df.groupby(["A", "B"]).sum()
Out[90]: 
                  C         D
A   B                        
bar one    1.511763  0.396823
    three -0.990582 -0.532532
    two    1.211526  1.208843
foo one    1.614581 -1.658537
    three  0.024580 -0.264610
    two    1.185429  1.348368

yeniden şekillendirme

Bölümlere bakın Hiyerarşik İndeksleme ve yeniden şekillendirme.

yığın

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
In [91]: arrays = [
   ....:    ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
   ....:    ["one", "two", "one", "two", "one", "two", "one", "two"],
   ....: ]
   ....: 

In [92]: index = pd.MultiIndex.from_arrays(arrays, names=["first", "second"])

In [93]: df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=["A", "B"])

In [94]: df2 = df[:4]

In [95]: df2
Out[95]: 
                     A         B
first second                    
bar   one    -0.727965 -0.589346
      two     0.339969 -0.693205
baz   one    -0.339355  0.593616
      two     0.884345  1.591431

. stack() “yöntemi ” öğesini DataFrame’in sütunlar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
In [96]: stacked = df2.stack(future_stack=True)

In [97]: stacked
Out[97]: 
first  second   
bar    one     A   -0.727965
               B   -0.589346
       two     A    0.339969
               B   -0.693205
baz    one     A   -0.339355
               B    0.593616
       two     A    0.884345
               B    1.591431
dtype: float64

“yığılmış ” Veri Çerçevesi veya Serisi ile ( MultiIndex olarak index), ters çalışması stack() dır-dir unstack(), varsayılan olarak son seviye:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
In [98]: stacked.unstack()
Out[98]: 
                     A         B
first second                    
bar   one    -0.727965 -0.589346
      two     0.339969 -0.693205
baz   one    -0.339355  0.593616
      two     0.884345  1.591431

In [99]: stacked.unstack(1)
Out[99]: 
second        one       two
first                      
bar   A -0.727965  0.339969
      B -0.589346 -0.693205
baz   A -0.339355  0.884345
      B  0.593616  1.591431

In [100]: stacked.unstack(0)
Out[100]: 
first          bar       baz
second                      
one    A -0.727965 -0.339355
       B -0.589346  0.593616
two    A  0.339969  0.884345
       B -0.693205  1.591431

Pivot tablolar

Aşağıdaki bölüme bakın Pivot Tabloları.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
In [101]: df = pd.DataFrame(
   .....:     {
   .....:         "A": ["one", "one", "two", "three"] * 3,
   .....:         "B": ["A", "B", "C"] * 4,
   .....:         "C": ["foo", "foo", "foo", "bar", "bar", "bar"] * 2,
   .....:         "D": np.random.randn(12),
   .....:         "E": np.random.randn(12),
   .....:     }
   .....: )
   .....: 

In [102]: df
Out[102]: 
        A  B    C         D         E
0     one  A  foo -1.202872  0.047609
1     one  B  foo -1.814470 -0.136473
2     two  C  foo  1.018601 -0.561757
3   three  A  bar -0.595447 -1.623033
4     one  B  bar  1.395433  0.029399
5     one  C  bar -0.392670 -0.542108
6     two  A  foo  0.007207  0.282696
7   three  B  foo  1.928123 -0.087302
8     one  C  foo -0.055224 -1.575170
9     one  A  bar  2.395985  1.771208
10    two  B  bar  1.552825  0.816482
11  three  C  bar  0.166599  1.100230

pivot_table() pivots a DataFrame belirten values, index ve columns

1
2
3
4
5
6
7
8
9
10
11
12
13
In [103]: pd.pivot_table(df, values="D", index=["A", "B"], columns=["C"])
Out[103]: 
C             bar       foo
A     B                    
one   A  2.395985 -1.202872
      B  1.395433 -1.814470
      C -0.392670 -0.055224
three A -0.595447       NaN
      B       NaN  1.928123
      C  0.166599       NaN
two   A       NaN  0.007207
      B  1.552825       NaN
      C       NaN  1.018601

Zaman serisi

pandalar performans için basit, güçlü ve verimli bir işlevselliğe sahiptir frekans dönüşümü sırasında yeniden örnekleme işlemleri (örneğin, ikinci olarak dönüştürme 5 dakikalık verilere veri). Bu son derece yaygındır, ancak bunlarla sınırlı değildir, finansal uygulamalar. Görmek Zaman Serisi bölümü.

1
2
3
4
5
6
7
8
In [104]: rng = pd.date_range("1/1/2012", periods=100, freq="s")

In [105]: ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)

In [106]: ts.resample("5Min").sum()
Out[106]: 
2012-01-01    24182
Freq: 5min, dtype: int64

Series.tz_localize()bir zaman serisini bir saat dilimine yerleştirir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
In [107]: rng = pd.date_range("3/6/2012 00:00", periods=5, freq="D")

In [108]: ts = pd.Series(np.random.randn(len(rng)), rng)

In [109]: ts
Out[109]: 
2012-03-06    1.857704
2012-03-07   -1.193545
2012-03-08    0.677510
2012-03-09   -0.153931
2012-03-10    0.520091
Freq: D, dtype: float64

In [110]: ts_utc = ts.tz_localize("UTC")

In [111]: ts_utc
Out[111]: 
2012-03-06 00:00:00+00:00    1.857704
2012-03-07 00:00:00+00:00   -1.193545
2012-03-08 00:00:00+00:00    0.677510
2012-03-09 00:00:00+00:00   -0.153931
2012-03-10 00:00:00+00:00    0.520091
Freq: D, dtype: float64

Series.tz_convert()saat dilimlerinin farkında olan zaman serilerini başka bir saat dilimine dönüştürür:

1
2
3
4
5
6
7
8
In [112]: ts_utc.tz_convert("US/Eastern")
Out[112]: 
2012-03-05 19:00:00-05:00    1.857704
2012-03-06 19:00:00-05:00   -1.193545
2012-03-07 19:00:00-05:00    0.677510
2012-03-08 19:00:00-05:00   -0.153931
2012-03-09 19:00:00-05:00    0.520091
Freq: D, dtype: float64

Sabit olmayan bir süre ekleme (BusinessDay) bir zaman serisine:

1
2
3
4
5
6
7
8
9
10
11
In [113]: rng
Out[113]: 
DatetimeIndex(['2012-03-06', '2012-03-07', '2012-03-08', '2012-03-09',
               '2012-03-10'],
              dtype='datetime64[ns]', freq='D')

In [114]: rng + pd.offsets.BusinessDay(5)
Out[114]: 
DatetimeIndex(['2012-03-13', '2012-03-14', '2012-03-15', '2012-03-16',
               '2012-03-16'],
              dtype='datetime64[ns]', freq=None)

kategoriler

pandalar kategorik verileri DataFrame. Tam dokümanlar için, kategorik giriş ve API belgeleri.

1
2
3
4
In [115]: df = pd.DataFrame(
   .....:     {"id": [1, 2, 3, 4, 5, 6], "raw_grade": ["a", "b", "b", "a", "a", "e"]}
   .....: )
   .....: 

Ham kaliteleri kategorik bir veri türüne dönüştürme:

1
2
3
4
5
6
7
8
9
10
11
12
In [116]: df["grade"] = df["raw_grade"].astype("category")

In [117]: df["grade"]
Out[117]: 
0    a
1    b
2    b
3    a
4    a
5    e
Name: grade, dtype: category
Categories (3, object): ['a', 'b', 'e']

Kategorileri daha anlamlı adlarla yeniden adlandırın:

1
2
3
In [118]: new_categories = ["very good", "good", "very bad"]

In [119]: df["grade"] = df["grade"].cat.rename_categories(new_categories)

Kategorileri yeniden sıralayın ve eksik kategorileri aynı anda ekleyin (aşağıdaki yöntemler) Series.cat() yeni bir dönüş Series varsayılan olarak):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [120]: df["grade"] = df["grade"].cat.set_categories(
   .....:     ["very bad", "bad", "medium", "good", "very good"]
   .....: )
   .....: 

In [121]: df["grade"]
Out[121]: 
0    very good
1         good
2         good
3    very good
4    very good
5     very bad
Name: grade, dtype: category
Categories (5, object): ['very bad', 'bad', 'medium', 'good', 'very good']

Sıralama, sözcük sırasına göre değil, kategorilerdeki siparişe göre:

1
2
3
4
5
6
7
8
9
In [122]: df.sort_values(by="grade")
Out[122]: 
   id raw_grade      grade
5   6         e   very bad
1   2         b       good
2   3         b       good
0   1         a  very good
3   4         a  very good
4   5         a  very good

Kategorik bir sütuna göre gruplandırma observed=False ayrıca boş kategorileri gösterir:

1
2
3
4
5
6
7
8
9
In [123]: df.groupby("grade", observed=False).size()
Out[123]: 
grade
very bad     1
bad          0
medium       0
good         2
very good    3
dtype: int64

Çizim

Görmek Çizim dokümanlar.

Matplotlib API’sına referans vermek için standart kuralı kullanıyoruz:

1
2
3
In [124]: import matplotlib.pyplot as plt

In [125]: plt.close("all")

. plt.close yöntem kullanılır yakın bir şekil penceresi:

1
2
3
4
5
In [126]: ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))

In [127]: ts = ts.cumsum()

In [128]: ts.plot();

../_images/series_plot_basic.png

plot()tüm sütunları çizer:

1
2
3
4
5
6
7
8
9
10
11
12
In [129]: df = pd.DataFrame(
   .....:     np.random.randn(1000, 4), index=ts.index, columns=["A", "B", "C", "D"]
   .....: )
   .....: 

In [130]: df = df.cumsum()

In [131]: plt.figure();

In [132]: df.plot();

In [133]: plt.legend(loc='best');

../_images/frame_plot_basic.png

Verileri içe ve dışa aktarma

Görmek IO Araçları Bölüm.

CSV

Bir csv dosyasına yazma: kullanarak DataFrame.to_csv()

1
2
3
In [134]: df = pd.DataFrame(np.random.randint(0, 5, (10, 5)))

In [135]: df.to_csv("foo.csv")

Bir csv dosyasından okuma: kullanarak read_csv()

1
2
3
4
5
6
7
8
9
10
11
12
13
In [136]: pd.read_csv("foo.csv")
Out[136]: 
   Unnamed: 0  0  1  2  3  4
0           0  4  3  1  1  2
1           1  1  0  2  3  2
2           2  1  4  2  1  2
3           3  0  4  0  2  2
4           4  4  2  2  3  4
5           5  4  0  4  3  1
6           6  2  1  2  0  3
7           7  4  0  4  4  4
8           8  4  4  1  0  1
9           9  0  4  3  0  3

Parke

Parke dosyasına yazma:

1
In [137]: df.to_parquet("foo.parquet")

Parke dosyasından okuma Mağaza kullanarak read_parquet():

1
2
3
4
5
6
7
8
9
10
11
12
13
In [138]: pd.read_parquet("foo.parquet")
Out[138]: 
   0  1  2  3  4
0  4  3  1  1  2
1  1  0  2  3  2
2  1  4  2  1  2
3  0  4  0  2  2
4  4  2  2  3  4
5  4  0  4  3  1
6  2  1  2  0  3
7  4  0  4  4  4
8  4  4  1  0  1
9  0  4  3  0  3

Excel

Okuma ve yazma Excel.

Kullanarak bir excel dosyasına yazma DataFrame.to_excel():

1
In [139]: df.to_excel("foo.xlsx", sheet_name="Sheet1")

Kullanarak bir excel dosyasından okuma read_excel():

1
2
3
4
5
6
7
8
9
10
11
12
13
In [140]: pd.read_excel("foo.xlsx", "Sheet1", index_col=None, na_values=["NA"])
Out[140]: 
   Unnamed: 0  0  1  2  3  4
0           0  4  3  1  1  2
1           1  1  0  2  3  2
2           2  1  4  2  1  2
3           3  0  4  0  2  2
4           4  4  2  2  3  4
5           5  4  0  4  3  1
6           6  2  1  2  0  3
7           7  4  0  4  4  4
8           8  4  4  1  0  1
9           9  0  4  3  0  3

Gotchas

Bir boole işlemi yapmaya çalışıyorsanız, Series veya DataFrame aşağıdaki gibi bir istisna görebilirsiniz:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
In [141]: if pd.Series([False, True, False]):
   .....:      print("I was true")
   .....: 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-141-b27eb9c1dfc0> in ?()
----> 1 if pd.Series([False, True, False]):
      2      print("I was true")

~/work/pandas/pandas/pandas/core/generic.py in ?(self)
   1575     @final
   1576     def __nonzero__(self) -> NoReturn:
-> 1577         raise ValueError(
   1578             f"The truth value of a {type(self).__name__} is ambiguous. "
   1579             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1580         )

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Görmek karşılaştırmalar ve Gotchas bir açıklama ve ne yapılması gerektiği.

Pandas Pivot Tabloları: Detaylı Açıklama

Pandas’ta pivot tabloları oluşturmak için pivot_table() fonksiyonu kullanılır. Bu fonksiyon, bir veya daha fazla sütunu indeks (satır), bir veya daha fazla sütunu sütun olarak kullanarak, diğer sütunlardaki verileri belirli bir toplama fonksiyonuyla özetler.

Pivot Tablo Nedir?

Bir pivot tablo, genellikle uzun (tidy) formattaki veriyi daha geniş (wide) formata dönüştürerek, belirli kategorilerdeki (gruplar) verilerin özet istatistiklerini (toplam, ortalama, sayım vb.) gösterir. Bu sayede, farklı boyutlardaki veriler arasındaki ilişkileri ve kalıpları kolayca keşfedebilirsiniz.

Örnek Senaryo:

Bir satış veri setiniz olduğunu düşünün:

BölgeÜrün TürüMiktarSatış
DoğuElektronik51000
BatıGiyim10500
DoğuGiyim3150
KuzeyElektronik81600
BatıElektronik2400
DoğuGiyim7350

Bu veriden şu gibi sorulara yanıt arayabiliriz:

  • Her bölgenin toplam satışı ne kadar?
  • Her ürün türünün toplam satışı ne kadar?
  • Her bölgedeki her ürün türünün toplam satışı ne kadar?

İşte burada pivot_table() devreye girer.

pivot_table() Fonksiyonunun Ana Argümanları

pd.pivot_table() fonksiyonunun temel argümanları şunlardır:

  1. data: Pivot tablo oluşturulacak DataFrame.
  2. values: Özetlenecek (toplanacak) sütun(lar). Buradaki değerler aggfunc ile işlenecektir.
  3. index: Pivot tablonun satır indeksi olacak sütun(lar). Benzersiz değerler her satır için bir kategori oluşturur. Birden fazla sütun verilirse, hiyerarşik (MultiIndex) bir indeks oluşturulur.
  4. columns: Pivot tablonun sütunları olacak sütun(lar). Benzersiz değerler her sütun için bir kategori oluşturur. Birden fazla sütun verilirse, hiyerarşik (MultiIndex) bir sütun oluşturulur.
  5. aggfunc: Değerleri toplamak için kullanılacak toplama fonksiyonu(lar). Varsayılan olarak 'mean' (ortalama) kullanılır. Tek bir fonksiyon ('sum', 'count', np.mean vb.) veya bir fonksiyon listesi/sözlüğü verilebilir.
  6. fill_value: Toplama işleminden sonra eksik kalan (NaN) değerleri doldurmak için kullanılacak değer.
  7. margins: True olarak ayarlanırsa, satır ve sütun toplamlarını içeren ‘All’ etiketli satır ve sütunlar ekler.
  8. dropna: True (varsayılan) ise, tüm değerleri NaN olan sütunları/satırları dışarıda bırakır.

pivot_table() ile Örnekler

Yukarıdaki satış veri setini kullanarak örnekler yapalım:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import pandas as pd
import numpy as np

# Örnek Veri Seti
data = {
    'Bölge': ['Doğu', 'Batı', 'Doğu', 'Kuzey', 'Batı', 'Doğu', 'Kuzey'],
    'Ürün Türü': ['Elektronik', 'Giyim', 'Giyim', 'Elektronik', 'Elektronik', 'Giyim', 'Giyim'],
    'Miktar': [5, 10, 3, 8, 2, 7, 12],
    'Satış': [1000, 500, 150, 1600, 400, 350, 600]
}
df = pd.DataFrame(data)
print("Orijinal DataFrame:\n", df)

print("\n--- Pandas Pivot Tablo Kullanımı ---")

# Örnek 1: Her Bölgenin Toplam Satışı (aggfunc=sum varsayılan değil, belirtilmeli)
# index='Bölge' ile satırları bölgelere göre grupla
# values='Satış' ile Satış sütununu özetle
# aggfunc='sum' ile toplamı al
pivot_1 = pd.pivot_table(df, index='Bölge', values='Satış', aggfunc='sum')
print("\n1. Her Bölgenin Toplam Satışı:\n", pivot_1)
# Çıktı:
#           Satış
# Bölge
# Batı        900
# Doğu       1500
# Kuzey      2200

# Örnek 2: Her Ürün Türünün Ortalama Miktarı (varsayılan aggfunc='mean')
# index='Ürün Türü' ile satırları ürün türlerine göre grupla
# values='Miktar' ile Miktar sütununu özetle
pivot_2 = pd.pivot_table(df, index='Ürün Türü', values='Miktar') # aggfunc varsayılan 'mean'
print("\n2. Her Ürün Türünün Ortalama Miktarı:\n", pivot_2)
# Çıktı:
#             Miktar
# Ürün Türü
# Elektronik     5.0
# Giyim          8.0

# Örnek 3: Bölge ve Ürün Türüne Göre Toplam Satış ve Ortalama Miktar
# index=['Bölge'] ile satırları bölgelere göre grupla
# columns=['Ürün Türü'] ile sütunları ürün türlerine göre grupla
# values=['Satış', 'Miktar'] ile hem Satış hem Miktar sütunlarını özetle
# aggfunc={'Satış': 'sum', 'Miktar': 'mean'} ile farklı sütunlara farklı fonksiyonlar
pivot_3 = pd.pivot_table(df,
                         index='Bölge',
                         columns='Ürün Türü',
                         values=['Satış', 'Miktar'],
                         aggfunc={'Satış': 'sum', 'Miktar': 'mean'},
                         fill_value=0) # NaN değerleri 0 ile doldur
print("\n3. Bölge ve Ürün Türüne Göre Toplam Satış ve Ortalama Miktar:\n", pivot_3)
# Çıktı:
#              Miktar            Satış
# Ürün Türü Elektronik Giyim Elektronik Giyim
# Bölge
# Batı             2.0  10.0      400   500
# Doğu             5.0   5.0     1000   500
# Kuzey            8.0  12.0     1600   600

# Örnek 4: Toplamlar (margins=True) ile pivot tablo
pivot_4 = pd.pivot_table(df,
                         index='Bölge',
                         columns='Ürün Türü',
                         values='Satış',
                         aggfunc='sum',
                         margins=True, # Satır ve sütun toplamlarını ekler
                         fill_value=0)
print("\n4. Toplamlar ile Bölge ve Ürün Türüne Göre Toplam Satış:\n", pivot_4)
# Çıktı:
# Ürün Türü  Elektronik  Giyim  All
# Bölge
# Batı              400    500  900
# Doğu             1000    500 1500
# Kuzey            1600    600 2200
# All              3000   1600 4600

# Örnek 5: Farklı fonksiyonları tek bir sütun için uygulama
pivot_5 = pd.pivot_table(df,
                         index='Bölge',
                         values='Satış',
                         aggfunc=[np.sum, np.mean, np.max])
print("\n5. Bölgeye Göre Satış için birden fazla fonksiyon:\n", pivot_5)
# Çıktı:
#        sum   mean   amax
# Bölge
# Batı   900  450.0    500
# Doğu  1500  500.0   1000
# Kuzey 2200 1100.0   1600

pivot_table() ve pivot() Arasındaki Fark

Pandas’ta bir de pivot() metodu bulunur. Temel fark şudur:

  • df.pivot(): Sadece tekil değerler içermesi garanti edilen bir sütunda (yani, index ve columns kombinasyonu için yalnızca bir values değeri olması gereken) “basit” bir pivot işlemi için kullanılır. aggfunc argümanı yoktur, yani toplama yapmaz. Eğer aynı index ve columns kombinasyonu için birden fazla değer varsa hata verir.
  • pd.pivot_table(): Daha genel ve esnek bir araçtır. Belirtilen index ve columns kombinasyonları için birden fazla değer varsa, bunları aggfunc ile toplar. Genellikle pivot() yerine pivot_table() tercih edilir çünkü daha yaygın veri senaryolarını destekler.

Özetle: pivot_table() daha çok “Excel pivot tablosu” deneyimini yansıtırken, pivot() daha çok “reshape” (yeniden şekillendirme) işlemine benzer.

Ne Zaman Pivot Tablo Kullanılır?

  • Veri Özeti ve Raporlama: Büyük veri setlerinden hızlı özet istatistikler (toplamlar, ortalamalar, sayımlar) elde etmek için.
  • İlişkileri Keşfetme: Farklı kategorik değişkenler arasındaki ilişkileri ve etkileşimleri görselleştirmek ve anlamak için. Örneğin, farklı ürün türlerinin farklı bölgelerdeki performansını karşılaştırmak.
  • Veri Temizleme ve Hazırlık: Bazı makine öğrenimi modelleri için veriyi geniş formata dönüştürmek gerekebilir.
  • Daha İyi Anlayış: Ham veriye göre daha anlaşılır ve yüksek seviyeli bir bakış açısı sunar.

Pandas’ın pivot_table() fonksiyonu, veri analizi ve raporlama sürecinizde size büyük kolaylık sağlayacaktır.

This post is licensed under CC BY 4.0 by the author.