Pandas: Pivot / unstack pada bingkai data besar tidak berfungsi int32 overflow

Dibuat pada 8 Mei 2019  ·  42Komentar  ·  Sumber: pandas-dev/pandas

Contoh Kode, contoh yang dapat disalin jika memungkinkan

predictor_purchases_p = predictor_purchases.groupby(["ag", "artikelnr"])["som"].max().unstack().fillna(0)

or

predictor_purchases_p = predictor_purchases.pivot(index="ag", columns="artikelnr", value="som")

Deskripsi masalah

Saya sedang mengerjakan data yang agak besar (memori> 100GB) di server yang gemuk (ram 3TB)
Saat memfaktorkan ulang kode saya dari pandas 0.21 ke versi terbaru, pivot/unstack sekarang mengembalikan pengecualian.

DataFrame yang tidak ditumpuk terlalu besar, menyebabkan int32 overflow

Saya dapat menghilangkan masalah dengan mengubah reshape.py:
ubah baris 121dari dtype np.int32 ke dtype np.int64:
num_cells = np.multiply(num_rows, num_columns, dtype=np.int64)

Keluaran yang diharapkan

Tidak dibatasi oleh redup int32 saat membentuk kembali bingkai data.
Ini terasa seperti batasan yang seharusnya tidak ada.

Keluaran pd.show_versions()

VERSI TERINSTAL

komit: Tidak ada
python: 3.7.3.final.0
python-bit: 64
OS: Linux
Rilis OS: 3.10.0-862.el7.x86_64
mesin: x86_64
prosesor: x86_64
urutan byte: sedikit
LC_ALL: Tidak ada
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8

panda: 0.24.2
pytest: Tidak ada
pip: 19,1
setuptools: 41.0.1
Cython: 0.29.7
numpy: 1.16.3
sip: 1.2.1
pyarrow: Tidak ada
xarray: 0.12.1
IPython: 7.5.0
sphinx: Tidak ada
kue: 0.5.1
dateutil: 2.8.0
pytz: 2019.1
blok: Tidak ada
kemacetan: Tidak ada
tabel: Tidak ada
numexpr: Tidak ada
bulu: Tidak ada
matplotlib: 3.0.3
openpyxl: 2.6.2
xlrd: Tidak ada
xlwt: Tidak ada
xlsxpenulis: Tidak ada
lxml.etree: Tidak ada
bs4: Tidak ada
html5lib: Tidak ada
sqlalchemy: 1.3.3
pymysql: Tidak ada
psycopg2: Tidak ada
jinja2: 2.10.1
s3fs: Tidak ada
parket cepat: 0.3.0
pandas_gbq: Tidak ada
pandas_datareader: Tidak ada
gcsfs: Tidak ada

Numeric Reshaping

Komentar yang paling membantu

Poin yang ingin saya angkat adalah: mengapa jumlah sel dibatasi hingga nilai maksimal np.int32?
num_cells = np.multiply(num_rows, num_columns, dtype=np.int32)

Ini menciptakan kendala saat bekerja dengan bingkai data besar.
Pada dasarnya, saya mengusulkan untuk mengubah ini menjadi np.int64.

Semua 42 komentar

coba master ini baru-baru ini ditambal

Server perusahaan, singkat cerita, saya hanya bisa bekerja dengan rilis conda.
Saya tidak dapat melakukan apa pun dari github dan membuat build.

https://github.com/pandas-dev/pandas/pull/23512/files

jika Anda mencoba melakukan pendekatan ini pada masalah Anda secara berbeda

Poin yang ingin saya angkat adalah: mengapa jumlah sel dibatasi hingga nilai maksimal np.int32?
num_cells = np.multiply(num_rows, num_columns, dtype=np.int32)

Ini menciptakan kendala saat bekerja dengan bingkai data besar.
Pada dasarnya, saya mengusulkan untuk mengubah ini menjadi np.int64.

jadi Anda memiliki kolom 2B?

Dataset saya saat ini memiliki
RangeIndex: 2584251 entri
Kolom: 4539 entri

jumlah_sel = 2584251 * 4539 = 11.729.915.289 sel

Jadi, saya punya 11,7 sel B

Menempatkan batasan int32 pada jumlah sel terlalu kecil untuk kumpulan data saya.
Saya cukup yakin ini menyebabkan masalah bagi pengguna lain.

Btw, di pandas 0.21 saya bisa menjalankan unstacks ini tanpa masalah. Ukuran tidak menjadi masalah.
Memutakhirkan ke pandas 0.24.2 menghilangkan kemampuan ini.

Ya, aku menabrak ini juga. Saya mencoba membuat 2,87 miliar sel di unstack saya. Saya melihat masalah #20601 dan pada dasarnya melemparkan kesalahan yang lebih informatif lebih masuk akal daripada meningkatkan dari int32 ke int64. Saya agak setuju dengan penilaian itu. Akan lebih baik jika memiliki opsi dalam unstack yang memungkinkan Anda memberi tahu bahwa Anda berharap memiliki jumlah sel yang sangat besar dan beralih ke indeks int64.

Saya tidak yakin betapa sulitnya ini atau apakah layak untuk memuaskan orang-orang dengan daftar panjang pasangan pengguna produk seperti saya.

@Rblivingstone pasti akan mengambil PR untuk mengizinkan int64 di sini; itu tidak diuji dan itulah mengapa kami menaikkan

Saya mendapatkan kesalahan ini pada penggunaan memori 6 Gb dengan memutar rating besar movielens.csv. Jadi saya setuju di zaman sekarang ini kita membutuhkan int64.

Ternyata saya mendapatkan kesalahan yang sama bahkan setelah mengubah baris reshape.py menjadi num_cells = np.multiply(num_rows, num_columns, dtype=np.int64) , meskipun kesalahan itu sepertinya terjadi di sana.

Saya mendapatkan "ValueError: dimensi negatif tidak diizinkan" setelah mengubah baris reshape.py menjadi num_cells = np.multiply(num_rows, num_columns, dtype=np.int64).

Adakah kemungkinan kita memiliki solusi yang berbeda? Saya hanya memiliki 6000 kolom ...

Saya memiliki masalah yang sama. Saya menggunakan data memori 9,9 BG.

df.pivot_table(index='uno', kolom=['programid'], nilai='avg_time')

ValueError: DataFrame yang tidak ditumpuk terlalu besar, menyebabkan int32 overflow

panda 0.25.0

@buddingPop @Code4SAFrankie @meganson apakah ada di antara kalian yang tertarik mengerjakan ini?

Kami juga membutuhkan contoh yang dapat direproduksi, jika ada yang bisa memberikannya.

Anda dapat mengunduh file rating.csv dari
https://www.kaggle.com/grouplens/movielens-20m-dataset

Kemudian buat pivottable seperti di bawah ini untuk mereproduksi masalah:
pivotTable = rating.pivot_table(index=['userId'],columns=['movieId'],values='rating')

Kami tidak akan dapat menyertakan pengunduhan kumpulan data itu dalam pengujian unit. Saya berasumsi ini dapat direproduksi dengan gaya data acak yang tepat? http://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports

Masalah yang sama di sini.
df.set_index(['Elemen', 'usix']).unstack().reset_index(col_level=1)
ValueError: DataFrame yang tidak ditumpuk terlalu besar, menyebabkan int32 overflow
panda: 0.23.4

@TomAugspurger Biarkan saya mencoba menghasilkan data serupa dengan data acak.

@TomAugspurger

Ini adalah tes yang sangat naif, tetapi tampaknya menghasilkan kembali kesalahan untuk saya.
`impor acak
impor string
impor panda sebagai pd

baris_cnt = 4000000
c1_unique_val_cnt = 1500000
c2_unique_val_cnt = 1600

c1_set = [ i for i in range(c1_unique_val_cnt)]
c1 = [ random.choice(c1_set) untuk i dalam range(row_cnt)]
c2_set = [ i for i in range(c2_unique_val_cnt)]
c2 = [ random.choice(c2_set) untuk i dalam range(row_cnt)]

df_test = pd.DataFrame({'c1':c1, 'c2': c2 })
t = df_test.set_index(['c1', 'c2']).unstack()`

Menghasilkan kesalahan: "ValueError: Unstacked DataFrame terlalu besar, menyebabkan int32 overflow"

Terima kasih @vengertsev. Contoh serupa yang sedikit lebih cepat, karena membuat vektorisasi kolom

In [62]: df = pd.DataFrame(np.random.randint(low=0, high=1500000, size=(4000000, 2)), columns=['a', 'b'])

In [63]: df.set_index(['a', 'b']).unstack()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-63-2ee2ef4b1279> in <module>
----> 1 df.set_index(['a', 'b']).unstack()

~/sandbox/pandas/pandas/core/frame.py in unstack(self, level, fill_value)
   6311         from pandas.core.reshape.reshape import unstack
   6312
-> 6313         return unstack(self, level, fill_value)
   6314
   6315     _shared_docs[

~/sandbox/pandas/pandas/core/reshape/reshape.py in unstack(obj, level, fill_value)
    408     if isinstance(obj, DataFrame):
    409         if isinstance(obj.index, MultiIndex):
--> 410             return _unstack_frame(obj, level, fill_value=fill_value)
    411         else:
    412             return obj.T.stack(dropna=False)

~/sandbox/pandas/pandas/core/reshape/reshape.py in _unstack_frame(obj, level, fill_value)
    438             value_columns=obj.columns,
    439             fill_value=fill_value,
--> 440             constructor=obj._constructor,
    441         )
    442         return unstacker.get_result()

~/sandbox/pandas/pandas/core/reshape/reshape.py in __init__(self, values, index, level, value_columns, fill_value, constructor)
    135
    136         if num_rows > 0 and num_columns > 0 and num_cells <= 0:
--> 137             raise ValueError("Unstacked DataFrame is too big, causing int32 overflow")
    138
    139         self._make_sorted_values_labels()

ValueError: Unstacked DataFrame is too big, causing int32 overflow

@TomAugspurger , Bagus, terima kasih!

Adakah yang tertarik untuk mengerjakan ini sekarang karena kami memiliki contoh yang dapat direproduksi?

@TomAugspurger


ValueError Traceback (panggilan terakhir terakhir)
di dalam
----> 1 peringkat = pd.read_csv('/home/ml/rating_stg.csv').groupby(['uno', 'program_title'])['view_percent'].mean().unstack()
2 peringkat.kepala()

~/anaconda3/lib/python3.7/site-packages/pandas/core/series.py di unstack(self, level, fill_value)
3299 """
3300 dari pandas.core.reshape.reshape impor unstack
-> 3301 mengembalikan unstack (self, level, fill_value)
3302
3303# -------------------------------------------------- -----------------------

~/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/reshape.py di unstack(obj, level, fill_value)
394 unstacker = _Unstacker(obj.values, obj.index, level=level,
395 isi_nilai=isi_nilai,
--> 396 konstruktor=obj._constructor_expanddim)
397 mengembalikan unstacker.get_result()
398

~/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/reshape.py di __init__(self, values, index, level, value_columns, fill_value, constructor)
122
123 jika num_rows > 0 dan num_columns > 0 dan num_cells <= 0:
--> 124 meningkatkan ValueError('DataFrame yang tidak ditumpuk terlalu besar,'
125 'menyebabkan int32 meluap')
126

ValueError: DataFrame yang tidak ditumpuk terlalu besar, menyebabkan int32 overflow

Halo,

saya menghadapi masalah yang sama mencoba membuat tabel pivot, jika seseorang dapat membantu!

Terima kasih

Kami membutuhkan PR untuk memperbaikinya di panda.

Pada Rabu, 18 Sep 2019 pukul 07:57 imanekho [email protected] menulis:

Halo,

saya menghadapi masalah yang sama mencoba membuat tabel pivot, jika seseorang bisa
Tolong !

Terima kasih


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/pandas-dev/pandas/issues/26314?email_source=notifications&email_token=AAKAOIWZIGTP6E5QAUW6DOLQKIQR5A5CNFSM4HLQBXN2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVX15Z
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAKAOIX6READO4P5TIOPTILQKIQR5ANCNFSM4HLQBXNQ
.

ini adalah satu-satunya solusi yang Anda pikirkan? solusi alternatif apa pun mungkin
saya sedang mengerjakan proyek akhir saya dan saya memiliki kumpulan data besar yang terlambat untuk mengubahnya
terima kasih

ini adalah satu-satunya solusi yang Anda pikirkan? solusi alternatif apa pun mungkin
saya sedang mengerjakan proyek akhir saya dan saya memiliki kumpulan data besar yang terlambat untuk mengubahnya
terima kasih

Anda dapat mencoba menurunkan versi panda Anda ke 0,21 (Lihat di sini https://github.com/pandas-dev/pandas/issues/26314#issuecomment-490502770). Saya mengalami masalah serupa baru-baru ini dan menurunkan versi dan berhasil di salah satu kumpulan data saya. Ini bukan solusi terbaik tetapi mungkin membuat Anda bergerak.

Terima kasih

Bisakah saya tahu bagaimana Anda menurunkan versi Anda? Saya mencoba menginstal 21.0 sehingga saya mendapatkan banyak kesalahan pada ketergantungan dengan perpustakaan lain
Terima kasih

Bisakah saya tahu bagaimana Anda menurunkan versi Anda? Saya mencoba menginstal 21.0 sehingga saya mendapatkan banyak kesalahan pada ketergantungan dengan perpustakaan lain
Terima kasih

pip install pandas==0.21

ini persis perintah yang saya gunakan

ini persis perintah yang saya gunakan

coba dengan Python 3.6

Setiap berita tentang ini, saya gagal untuk memutar kembali ke 0,21. Tindakan saya selanjutnya adalah menulis ulang fungsi yang di-vektorkan sebagai loop, tetapi saya lebih suka tidak.

Saya mendapatkan kesalahan ini di ver. 0.25.3 , ada kabar?

Masih buka, masih mencari relawan untuk memperbaikinya.

Ada pembaruan tentang ini?
Apakah menurunkan versi Panda membantu ??

pandas adalah proyek sukarelawan; PR akan diterima dari komunitas untuk masalah ini atau lainnya

Saya telah terjebak dengan ini beberapa hari dan akhirnya saya memperbaikinya dengan mengubah int32 menjadi int64. Apakah tidak apa-apa untuk mengirim permintaan tarik dengan itu?

@KaonToPion tolong lakukan.

@KaonToPion Harap beri tahu kami setelah Anda check-in... Saya ingin memperbaiki ini secepatnya... Terima kasih banyak!

Maaf, saya mengalami masalah dengan menginstal lingkungan pengembangan panda itu sebabnya butuh waktu lama

@KaonToPion juga menunggu perbaikan ini. Jika Anda bisa, silakan mencoba lagi, itu akan sangat bagus. Terima kasih!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat