3 回答

TA貢獻1798條經(jīng)驗 獲得超3個贊
您需要將變量設(shè)置為data等于附加數(shù)據(jù)框。與appendpython list上的方法不同,pandas append不會在原地發(fā)生
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

TA貢獻1900條經(jīng)驗 獲得超5個贊
每次調(diào)用append時,Pandas都會返回原始數(shù)據(jù)框的副本以及新行。這稱為二次復(fù)制,它是一個O(N ^ 2)操作,它將很快變得非常慢(特別是因為您有大量數(shù)據(jù))。
對于您的情況,我建議使用列表,將其追加到列表中,然后調(diào)用數(shù)據(jù)框構(gòu)造函數(shù)。
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

TA貢獻1906條經(jīng)驗 獲得超3個贊
您可以構(gòu)建數(shù)據(jù)框架而無需循環(huán):
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
添加回答
舉報