[英]Using pandas .append within for loop
我在 for 循環中將行附加到 pandas DataFrame 中,但最后 dataframe 始終為空。 我不想將行添加到數組中,然后調用 DataFrame 構造函數,因為我的實際 for 循環處理大量數據。 我也試過pd.concat
沒有成功。 誰能強調我缺少什么來使 append 語句起作用? 這是一個虛擬示例:
import pandas as pd
import numpy as np
data = pd.DataFrame([])
for i in np.arange(0, 4):
if i % 2 == 0:
data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True)
else:
data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True)
print data.head()
Empty DataFrame
Columns: []
Index: []
[Finished in 0.676s]
每次調用 append 時,Pandas 都會返回原始數據幀的副本以及您的新行。 這稱為二次復制,它是一個 O(N^2) 操作,很快就會變得非常慢(特別是因為您有大量數據)。
在您的情況下,我建議使用列表,附加到它們,然后調用數據幀構造函數。
a_list = []
b_list = []
for data in my_data:
a, b = process_data(data)
a_list.append(a)
b_list.append(b)
df = pd.DataFrame({'A': a_list, 'B': b_list})
del a_list, b_list
時間安排
%%timeit
data = pd.DataFrame([])
for i in np.arange(0, 10000):
if i % 2 == 0:
data = data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True)
else:
data = data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True)
1 loops, best of 3: 6.8 s per loop
%%timeit
a_list = []
b_list = []
for i in np.arange(0, 10000):
if i % 2 == 0:
a_list.append(i)
b_list.append(i + 1)
else:
a_list.append(i)
b_list.append(None)
data = pd.DataFrame({'A': a_list, 'B': b_list})
100 loops, best of 3: 8.54 ms per loop
您需要將變量data
設置為等於附加的數據框。 與 python 列表上的append
方法不同,pandas append
不會就地發生
import pandas as pd
import numpy as np
data = pd.DataFrame([])
for i in np.arange(0, 4):
if i % 2 == 0:
data = data.append(pd.DataFrame({'A': i, 'B': i + 1}, index=[0]), ignore_index=True)
else:
data = data.append(pd.DataFrame({'A': i}, index=[0]), ignore_index=True)
print(data.head())
A B
0 0 1.0
1 2 3.0
2 3 NaN
注意:此答案旨在回答提出的問題。 然而,這並不是組合大量數據幀的最佳策略。 有關更優化的解決方案,請查看下面亞歷山大的回答
您可以在沒有循環的情況下構建數據框:
n = 4
data = pd.DataFrame({'A': np.arange(n)})
data['B'] = np.NaN
data.loc[data['A'] % 2 == 0, 'B'] = data['A'] + 1
對於:
n = 10000
這有點快:
%%timeit
data = pd.DataFrame({'A': np.arange(n)})
data['B'] = np.NaN
data.loc[data['A'] % 2 == 0, 'B'] = data['A'] + 1
100 loops, best of 3: 3.3 ms per loop
對比
%%timeit
a_list = []
b_list = []
for i in np.arange(n):
if i % 2 == 0:
a_list.append(i)
b_list.append(i + 1)
else:
a_list.append(i)
b_list.append(None)
data1 = pd.DataFrame({'A': a_list, 'B': b_list})
100 loops, best of 3: 12.4 ms per loop
當您使用 data.append(pd.DataFrame[['1','2'],['3','4']], ignore_index=True) 時,必須將結果分配回 dataframe。 結果將包含整理的數據,例如。
data = data.append(pd.DataFrame([['1','2'],['3','4']])) <= 在循環中使用這個
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.