Đó là một thời gian dài, nhưng tôi cũng gặp phải vấn đề tương tự. Và tìm thấy ở đây rất nhiều câu trả lời thú vị. Vì vậy, tôi đã nhầm lẫn sử dụng phương pháp nào.
Trong trường hợp thêm nhiều hàng vào dataframe, tôi quan tâm đến hiệu suất tốc độ . Vì vậy, tôi đã thử 4 phương pháp phổ biến nhất và kiểm tra tốc độ của chúng.
CẬP NHẬT NĂM 2019 bằng cách sử dụng các phiên bản mới của gói. Cũng được cập nhật sau khi bình luận @FooBar
HIỆU SUẤT TỐC ĐỘ
- Sử dụng .append ( câu trả lời của NPE )
- Sử dụng .loc ( câu trả lời của fred )
- Sử dụng .loc với preallocating ( câu trả lời của FooBar )
- Sử dụng dict và tạo DataFrame cuối cùng ( câu trả lời của ShikharDua )
Kết quả (tính bằng giây):
|------------|-------------|-------------|-------------|
| Approach | 1000 rows | 5000 rows | 10 000 rows |
|------------|-------------|-------------|-------------|
| .append | 0.69 | 3.39 | 6.78 |
|------------|-------------|-------------|-------------|
| .loc w/o | 0.74 | 3.90 | 8.35 |
| prealloc | | | |
|------------|-------------|-------------|-------------|
| .loc with | 0.24 | 2.58 | 8.70 |
| prealloc | | | |
|------------|-------------|-------------|-------------|
| dict | 0.012 | 0.046 | 0.084 |
|------------|-------------|-------------|-------------|
Cũng cảm ơn @krassowski vì bình luận hữu ích - Tôi đã cập nhật mã.
Vì vậy, tôi sử dụng bổ sung thông qua từ điển cho bản thân mình.
Mã số:
import pandas as pd
import numpy as np
import time
del df1, df2, df3, df4
numOfRows = 1000
# append
startTime = time.perf_counter()
df1 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows-4):
df1 = df1.append( dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']), ignore_index=True)
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df1.shape)
# .loc w/o prealloc
startTime = time.perf_counter()
df2 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows):
df2.loc[i] = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df2.shape)
# .loc with prealloc
df3 = pd.DataFrame(index=np.arange(0, numOfRows), columns=['A', 'B', 'C', 'D', 'E'] )
startTime = time.perf_counter()
for i in range( 1,numOfRows):
df3.loc[i] = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df3.shape)
# dict
startTime = time.perf_counter()
row_list = []
for i in range (0,5):
row_list.append(dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']))
for i in range( 1,numOfRows-4):
dict1 = dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E'])
row_list.append(dict1)
df4 = pd.DataFrame(row_list, columns=['A','B','C','D','E'])
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df4.shape)
Tái bút: Tôi tin rằng, nhận thức của tôi không hoàn hảo và có thể có một số tối ưu hóa.