Bagaimana cara saya mendapatkan hitung baris dari DataFrame panda?
Tabel ini merangkum berbagai situasi di mana Anda ingin menghitung sesuatu dalam DataFrame (atau Seri, untuk kelengkapan), bersama dengan metode yang direkomendasikan.
Catatan kaki
DataFrame.count
mengembalikan jumlah untuk setiap kolom sebagai Series
karena jumlah bukan nol bervariasi berdasarkan kolom.
DataFrameGroupBy.size
mengembalikan a Series
, karena semua kolom dalam grup yang sama berbagi jumlah baris yang sama.
DataFrameGroupBy.count
mengembalikan a DataFrame
, karena jumlah bukan nol dapat berbeda di seluruh kolom dalam grup yang sama. Untuk mendapatkan hitungan non-null grup-bijaksana untuk kolom tertentu, gunakan di df.groupby(...)['x'].count()
mana "x" adalah kolom untuk menghitung.
Contoh Kode Minimal
Di bawah ini, saya menunjukkan contoh masing-masing metode yang dijelaskan dalam tabel di atas. Pertama, pengaturan -
df = pd.DataFrame({
'A': list('aabbc'), 'B': ['x', 'x', np.nan, 'x', np.nan]})
s = df['B'].copy()
df
A B
0 a x
1 a x
2 b NaN
3 b x
4 c NaN
s
0 x
1 x
2 NaN
3 x
4 NaN
Name: B, dtype: object
Row Hitungan DataFrame sebuah: len(df)
, df.shape[0]
, ataulen(df.index)
len(df)
# 5
df.shape[0]
# 5
len(df.index)
# 5
Tampaknya konyol untuk membandingkan kinerja operasi waktu yang konstan, terutama ketika perbedaannya ada pada tingkat "serius, jangan khawatir tentang hal itu". Tapi ini tampaknya menjadi tren dengan jawaban lain, jadi saya melakukan hal yang sama untuk kelengkapan.
Dari 3 metode di atas, len(df.index)
(sebagaimana disebutkan dalam jawaban lain) adalah yang tercepat.
Catatan
- Semua metode di atas adalah operasi waktu konstan karena mereka adalah pencarian atribut sederhana.
df.shape
(Mirip dengan ndarray.shape
) adalah atribut yang mengembalikan tuple dari (# Rows, # Cols)
. Misalnya, df.shape
kembalikan (8,
2)
untuk contoh di sini.
Kolom Hitungan DataFrame sebuah: df.shape[1]
,len(df.columns)
df.shape[1]
# 2
len(df.columns)
# 2
Analog dengan len(df.index)
, len(df.columns)
adalah yang tercepat dari kedua metode (tetapi membutuhkan lebih banyak karakter untuk mengetik).
Row Hitungan Seri: len(s)
, s.size
,len(s.index)
len(s)
# 5
s.size
# 5
len(s.index)
# 5
s.size
dan len(s.index)
hampir sama dalam hal kecepatan. Tapi saya rekomendasikan len(df)
.
Catatan
size
adalah atribut, dan mengembalikan jumlah elemen (= jumlah baris untuk Seri apa pun). DataFrames juga mendefinisikan atribut ukuran yang mengembalikan hasil yang sama dengan df.shape[0] * df.shape[1]
.
Hitungan Baris Non-Null: DataFrame.count
danSeries.count
Metode yang dijelaskan di sini hanya menghitung nilai-nilai non-nol (artinya NaN diabaikan).
Memanggil DataFrame.count
akan mengembalikan jumlah non-NaN untuk setiap kolom:
df.count()
A 5
B 3
dtype: int64
Untuk Seri, gunakan Series.count
efek yang serupa:
s.count()
# 3
Hitungan Baris menurut Kelompok: GroupBy.size
Untuk DataFrames
, gunakan DataFrameGroupBy.size
untuk menghitung jumlah baris per grup.
df.groupby('A').size()
A
a 2
b 2
c 1
dtype: int64
Demikian pula, untuk Series
, Anda akan menggunakan SeriesGroupBy.size
.
s.groupby(df.A).size()
A
a 2
b 2
c 1
Name: B, dtype: int64
Dalam kedua kasus, a Series
dikembalikan. Ini masuk akal DataFrames
juga karena semua grup memiliki jumlah baris yang sama.
Hitungan Baris Non-Null Kelompok-bijaksana: GroupBy.count
Mirip dengan di atas, tetapi gunakan GroupBy.count
, tidak GroupBy.size
. Perhatikan bahwa size
selalu mengembalikan a Series
, sementara count
mengembalikan a Series
jika dipanggil pada kolom tertentu, atau a DataFrame
.
Metode berikut mengembalikan hal yang sama:
df.groupby('A')['B'].size()
df.groupby('A').size()
A
a 2
b 2
c 1
Name: B, dtype: int64
Sementara itu, untuk count
, sudah
df.groupby('A').count()
B
A
a 2
b 1
c 0
... memanggil seluruh objek GroupBy, v / s,
df.groupby('A')['B'].count()
A
a 2
b 1
c 0
Name: B, dtype: int64
Dipanggil pada kolom tertentu.