Động lực
Nhiều bộ dữ liệu đủ lớn để chúng ta cần quan tâm đến tốc độ / hiệu quả. Vì vậy, tôi cung cấp giải pháp này trong tinh thần đó. Nó cũng xảy ra ngắn gọn.
Để so sánh, hãy bỏ index
cột
df = data_set.drop('index', 1)
Giải pháp
tôi sẽ đề xuất việc sử dụng zip
vàmap
list(zip(*map(df.get, df)))
[('2012-02-17', 24.75, 25.03),
('2012-02-16', 25.0, 25.07),
('2012-02-15', 24.99, 25.15),
('2012-02-14', 24.68, 25.05),
('2012-02-13', 24.62, 24.77),
('2012-02-10', 24.38, 24.61)]
Nó cũng xảy ra linh hoạt nếu chúng ta muốn xử lý một tập hợp con cụ thể của các cột. Chúng tôi sẽ giả sử các cột chúng tôi đã hiển thị là tập hợp con chúng tôi muốn.
list(zip(*map(df.get, ['data_date', 'data_1', 'data_2'])))
[('2012-02-17', 24.75, 25.03),
('2012-02-16', 25.0, 25.07),
('2012-02-15', 24.99, 25.15),
('2012-02-14', 24.68, 25.05),
('2012-02-13', 24.62, 24.77),
('2012-02-10', 24.38, 24.61)]
Nhanh hơn là gì?
Hóa ra records
là nhanh nhất theo sau là hội tụ không có triệu chứng zipmap
vàiter_tuples
Tôi sẽ sử dụng một thư viện simple_benchmarks
mà tôi nhận được từ bài đăng này
from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()
import pandas as pd
import numpy as np
def tuple_comp(df): return [tuple(x) for x in df.to_numpy()]
def iter_namedtuples(df): return list(df.itertuples(index=False))
def iter_tuples(df): return list(df.itertuples(index=False, name=None))
def records(df): return df.to_records(index=False).tolist()
def zipmap(df): return list(zip(*map(df.get, df)))
funcs = [tuple_comp, iter_namedtuples, iter_tuples, records, zipmap]
for func in funcs:
b.add_function()(func)
def creator(n):
return pd.DataFrame({"A": random.randint(n, size=n), "B": random.randint(n, size=n)})
@b.add_arguments('Rows in DataFrame')
def argument_provider():
for n in (10 ** (np.arange(4, 11) / 2)).astype(int):
yield n, creator(n)
r = b.run()
Kiểm tra kết quả
r.to_pandas_dataframe().pipe(lambda d: d.div(d.min(1), 0))
tuple_comp iter_namedtuples iter_tuples records zipmap
100 2.905662 6.626308 3.450741 1.469471 1.000000
316 4.612692 4.814433 2.375874 1.096352 1.000000
1000 6.513121 4.106426 1.958293 1.000000 1.316303
3162 8.446138 4.082161 1.808339 1.000000 1.533605
10000 8.424483 3.621461 1.651831 1.000000 1.558592
31622 7.813803 3.386592 1.586483 1.000000 1.515478
100000 7.050572 3.162426 1.499977 1.000000 1.480131
r.plot()
list(df.itertuples(index=False, name=None))