Rumah > pembangunan bahagian belakang > Tutorial Python > Sepuluh teknik pemprosesan data alternatif untuk Panda

Sepuluh teknik pemprosesan data alternatif untuk Panda

WBOY
Lepaskan: 2023-04-15 09:19:02
ke hadapan
2403 orang telah melayarinya

Teknik yang disusun dalam artikel ini berbeza daripada teknik biasa yang disusun dalam 10 Panda sebelum ini Anda mungkin tidak kerap menggunakannya, tetapi kadangkala apabila anda menghadapi beberapa masalah yang sangat sukar, teknik ini boleh membantu anda Menyelesaikan beberapa masalah yang jarang berlaku.

Sepuluh teknik pemprosesan data alternatif untuk Panda

1. Jenis kategori

Secara lalai, lajur dengan bilangan pilihan yang terhad akan diberikan jenis objek. Tetapi ia bukan pilihan yang cekap dari segi ingatan. Kita boleh mengindeks lajur ini dan hanya menggunakan rujukan kepada objek dan bukan nilai sebenar. Pandas menyediakan Dtype yang dipanggil Categorical untuk menyelesaikan masalah ini.

Sebagai contoh, set data yang besar dengan laluan imej. Setiap baris mempunyai tiga lajur: sauh, positif dan negatif.

Menggunakan Categorical untuk lajur kategori boleh mengurangkan penggunaan memori dengan ketara.

# raw data
 +----------+------------------------+
 |class |filename|
 +----------+------------------------+
 | Bathroom | Bathroombath_1.jpg|
 | Bathroom | Bathroombath_100.jpg|
 | Bathroom | Bathroombath_1003.jpg |
 | Bathroom | Bathroombath_1004.jpg |
 | Bathroom | Bathroombath_1005.jpg |
 +----------+------------------------+
 
 # target
 +------------------------+------------------------+----------------------------+
 | anchor |positive|negative|
 +------------------------+------------------------+----------------------------+
 | Bathroombath_1.jpg| Bathroombath_100.jpg| Dinningdin_540.jpg|
 | Bathroombath_100.jpg| Bathroombath_1003.jpg | Dinningdin_1593.jpg |
 | Bathroombath_1003.jpg | Bathroombath_1004.jpg | Bedroombed_329.jpg|
 | Bathroombath_1004.jpg | Bathroombath_1005.jpg | Livingroomliving_1030.jpg |
 | Bathroombath_1005.jpg | Bathroombath_1007.jpg | Bedroombed_1240.jpg |
 +------------------------+------------------------+----------------------------+
Salin selepas log masuk

Nilai lajur nama fail akan disalin dengan kerap. Oleh itu, penggunaan ingatan boleh dikurangkan dengan menggunakan Kategori.

Mari baca set data sasaran dan lihat perbezaan dalam ingatan:

triplets.info(memory_usage="deep")
 
 # Column Non-Null Count Dtype
 # --- ------ -------------- -----
 # 0 anchor 525000 non-null category
 # 1 positive 525000 non-null category
 # 2 negative 525000 non-null category
 # dtypes: category(3)
 # memory usage: 4.6 MB
 
 # without categories
 triplets_raw.info(memory_usage="deep")
 
 # Column Non-Null Count Dtype
 # --- ------ -------------- -----
 # 0 anchor 525000 non-null object
 # 1 positive 525000 non-null object
 # 2 negative 525000 non-null object
 # dtypes: object(3)
 # memory usage: 118.1 MB
Salin selepas log masuk

Perbezaan sangat besar dan berkembang secara tidak linear apabila bilangan ulangan meningkat.

2. Penukaran baris-lajur

Kami sering menghadapi masalah penukaran baris-lajur dalam sql, kadangkala Panda juga memerlukannya. census_start .csv file:

Sepuluh teknik pemprosesan data alternatif untuk Panda

Seperti yang anda lihat, ini disimpan mengikut tahun Adalah lebih baik jika terdapat tahun lajur dan pct_bb, dan setiap baris mempunyai yang sepadan nilai.

cols = sorted([col for col in original_df.columns 
 if col.startswith("pct_bb")])
 df = original_df[(["cfips"] + cols)]
 df = df.melt(id_vars="cfips",
value_vars=cols,
var_name="year",
value_name="feature").sort_values(by=["cfips", "year"])
Salin selepas log masuk

Lihat hasilnya, adakah ia lebih baik:

Sepuluh teknik pemprosesan data alternatif untuk Panda

3 apply() sangat lambat

Seperti yang kami perkenalkan kali lepas, sebaiknya jangan gunakan kaedah ini kerana kaedah ini berulang melalui setiap baris dan memanggil kaedah yang ditentukan. Tetapi jika kita tidak mempunyai pilihan lain, adakah cara untuk meningkatkan kelajuan?

Anda boleh menggunakan pakej seperti lebih pantas atau pandarallew untuk menyelaraskan proses.

Lebih pantas

import pandas as pd
 import swifter
 
 def target_function(row):
 return row * 10
 
 def traditional_way(data):
 data['out'] = data['in'].apply(target_function)
 
 def swifter_way(data):
 data['out'] = data['in'].swifter.apply(target_function)
Salin selepas log masuk

Pandaralllel

import pandas as pd
 from pandarallel import pandarallel
 
 def target_function(row):
 return row * 10
 
 def traditional_way(data):
 data['out'] = data['in'].apply(target_function)
 
 def pandarallel_way(data):
 pandarallel.initialize()
 data['out'] = data['in'].parallel_apply(target_function)
Salin selepas log masuk

Melalui multi-threading, kelajuan pengiraan boleh dipertingkatkan terbaik untuk menggunakan dask atau pyspark

4 Nilai null, int, Int64

Jenis data integer standard tidak menyokong nilai null, jadi ia akan ditukar secara automatik kepada nombor titik terapung. Jadi jika data anda memerlukan nilai nol dalam medan integer, pertimbangkan untuk menggunakan jenis data Int64 kerana ia akan menggunakan panda.NA untuk mewakili nilai nol.

5. Csv, mampatan atau parket? Parket akan mengekalkan jenis data, jadi tidak perlu menentukan djenis semasa membaca data. Fail parket dimampatkan menggunakan snappy secara lalai, jadi ia mengambil sedikit ruang cakera. Di bawah anda boleh melihat beberapa perbandingan

Membaca parket memerlukan pakej tambahan, seperti pyarrow atau fastparket. chatgpt mengatakan bahawa pyarrow lebih cepat daripada fastparquet, tetapi apabila saya menguji pada set data yang kecil, fastparquet lebih cepat daripada pyarrow, tetapi disyorkan untuk menggunakan pyarrow di sini, kerana panda 2.0 juga menggunakan ini secara lalai.
|file|size |
 +------------------------+---------+
 | triplets_525k.csv| 38.4 MB |
 | triplets_525k.csv.gzip |4.3 MB |
 | triplets_525k.csv.zip|4.5 MB |
 | triplets_525k.parquet|1.9 MB |
 +------------------------+---------+
Salin selepas log masuk

6. value_counts ()

Mengira frekuensi relatif, termasuk mendapatkan nilai mutlak, mengira dan membahagikan dengan jumlah adalah rumit, tetapi menggunakan value_counts, tugas ini boleh dicapai dengan lebih mudah dan Kaedah ini menyediakan pilihan untuk memasukkan atau mengecualikan nilai nol.

df = pd.DataFrame({"a": [1, 2, None], "b": [4., 5.1, 14.02]})
 df["a"] = df["a"].astype("Int64")
 print(df.info())
 print(df["a"].value_counts(normalize=True, dropna=False),
df["a"].value_counts(normalize=True, dropna=True), sep="nn")
Salin selepas log masuk

Sepuluh teknik pemprosesan data alternatif untuk Panda

Bukankah ini lebih mudah

7 sekarang Masih dalam fasa ujian.

Panda adalah satu benang, tetapi Modin boleh mempercepatkan aliran kerja anda dengan menskalakan panda Ia berfungsi dengan baik terutamanya pada set data yang lebih besar di mana panda boleh menjadi sangat perlahan atau penggunaan memori yang berlebihan membawa kepada OOM.

Berikut ialah gambarajah seni bina laman web rasmi modin Jika anda berminat, kajinya:

!pip install modin[all]
 
 import modin.pandas as pd
 df = pd.read_csv("my_dataset.csv")
Salin selepas log masuk

8. . extract()Sepuluh teknik pemprosesan data alternatif untuk Panda

Jika anda sering menemui data separa berstruktur yang kompleks dan perlu memisahkan lajur individu daripadanya, anda boleh menggunakan kaedah ini:

import pandas as pd
 
 regex = (r'(?P<title>[A-Za-z's]+),'
r'(?P<author>[A-Za-zs']+),'
r'(?P<isbn>[d-]+),'
r'(?P<year>d{4}),'
r'(?P<publisher>.+)')
 addr = pd.Series([
 "The Lost City of Amara,Olivia Garcia,978-1-234567-89-0,2023,HarperCollins",
 "The Alchemist's Daughter,Maxwell Greene,978-0-987654-32-1,2022,Penguin Random House",
 "The Last Voyage of the HMS Endeavour,Jessica Kim,978-5-432109-87-6,2021,Simon & Schuster",
 "The Ghosts of Summer House,Isabella Lee,978-3-456789-12-3,2000,Macmillan Publishers",
 "The Secret of the Blackthorn Manor,Emma Chen,978-9-876543-21-0,2023,Random House Children's Books"
])
 addr.str.extract(regex)
Salin selepas log masuk

9、读写剪贴板

这个技巧有人一次也用不到,但是有人可能就是需要,比如:在分析中包含PDF文件中的表格时。通常的方法是复制数据,粘贴到Excel中,导出到csv文件中,然后导入Pandas。但是,这里有一个更简单的解决方案:pd.read_clipboard()。我们所需要做的就是复制所需的数据并执行一个方法。

有读就可以写,所以还可以使用to_clipboard()方法导出到剪贴板。

但是要记住,这里的剪贴板是你运行python/jupyter主机的剪切板,并不可能跨主机粘贴,一定不要搞混了。

10、数组列分成多列

假设我们有这样一个数据集,这是一个相当典型的情况:

import pandas as pd
 df = pd.DataFrame({"a": [1, 2, 3],
"b": [4, 5, 6],
"category": [["foo", "bar"], ["foo"], ["qux"]]})
 
 # let's increase the number of rows in a dataframe
 df = pd.concat([df]*10000, ignore_index=True)
Salin selepas log masuk

Sepuluh teknik pemprosesan data alternatif untuk Panda

我们想将category分成多列显示,例如下面的

Sepuluh teknik pemprosesan data alternatif untuk Panda

先看看最慢的apply:

def dummies_series_apply(df):
return df.join(df['category'].apply(pd.Series) 
.stack() 
.str.get_dummies() 
.groupby(level=0) 
.sum()) 
.drop("category", axis=1)
 %timeit dummies_series_apply(df.copy())
 #5.96 s ± 66.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Salin selepas log masuk

sklearn的MultiLabelBinarizer

from sklearn.preprocessing import MultiLabelBinarizer
 def sklearn_mlb(df):
mlb = MultiLabelBinarizer()
return df.join(pd.DataFrame(mlb.fit_transform(df['category']), columns=mlb.classes_)) 
.drop("category", axis=1)
 %timeit sklearn_mlb(df.copy())
 #35.1 ms ± 1.31 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Salin selepas log masuk

是不是快了很多,我们还可以使用一般的向量化操作对其求和:

def dummies_vectorized(df):
return pd.get_dummies(df.explode("category"), prefix="cat") 
.groupby(["a", "b"]) 
.sum() 
.reset_index()
 %timeit dummies_vectorized(df.copy())
 #29.3 ms ± 1.22 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Salin selepas log masuk

Sepuluh teknik pemprosesan data alternatif untuk Panda

使用第一个方法(在StackOverflow上的回答中非常常见)会给出一个非常慢的结果。而其他两个优化的方法的时间是非常快速的。

总结

我希望每个人都能从这些技巧中学到一些新的东西。重要的是要记住尽可能使用向量化操作而不是apply()。此外,除了csv之外,还有其他有趣的存储数据集的方法。不要忘记使用分类数据类型,它可以节省大量内存。感谢阅读!

Atas ialah kandungan terperinci Sepuluh teknik pemprosesan data alternatif untuk Panda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan