Я использую панды ежедневно в своей работе. Недавно я обновился до 0.15.1 с 0.13.1, и теперь куча кода слишком медленная, чтобы закончить при итерации через относительно небольшие DataFrames.Очень медленная индексация в Pandas 0,15 по сравнению с 0,13.1
(я понимаю, что часто лучше/быстрее способы выполнения итерации на DataFrame, но иногда это очень ясно и сжато, чтобы иметь для структуры цикла)
я сузил проблему вниз к проблеме при смешивании типов :
def iterGet(df,col):
for i in df.index:
tmp = df[col].loc[i]
def iterLocSet(df,col,val):
for i in df.index:
#df[col].loc[i] = val
df.loc[i,col] = val
df.at[i,col] = val
return df
N = 100
df = pd.DataFrame(rand(N,3),columns = ['a','b','c'])
df['listCol'] = [[] for i in range(df.shape[0])]
df['strCol'] = [str(i) for i in range(df.shape[0])]
df['intCol'] = [i for i in range(df.shape[0])]
df['float64Col'] = [float64(i) for i in range(df.shape[0])]
print df.a[:5]
%time iterGet(df[['a','intCol']].copy(),'a')
%time tmpDf = iterLocSet(df[['a','intCol']].copy(),'a',0.)
print tmpDf.a[:5]
%time iterGet(df[['a','float64Col']].copy(),'a')
%time tmpDf = iterLocSet(df[['a','float64Col']].copy(),'a',0.)
print tmpDf.a[:5]
на панд 0.15.1 результат:
0 0.114738
1 0.586447
2 0.296024
3 0.446697
4 0.720984
Name: a, dtype: float64
Wall time: 6 ms
Wall time: 3.41 s
0 0
1 0
2 0
3 0
4 0
Name: a, dtype: float64
Wall time: 6 ms
Wall time: 18 ms
0 0
1 0
2 0
3 0
4 0
Name: a, dtype: float64
Но панд 0.13.1 результат заключается в следующем:
0 0.651796
1 0.738661
2 0.885366
3 0.513006
4 0.846323
Name: a, dtype: float64
Wall time: 6 ms
Wall time: 14 ms
0 0
1 0
2 0
3 0
4 0
Name: a, dtype: float64
Wall time: 5 ms
Wall time: 15 ms
0 0
1 0
2 0
3 0
4 0
Name: a, dtype: float6
Похоже, что выполнение задания с использованием индексации строк в многотипном массиве в 200 раз медленнее в Pandas 0.15.1?
Я знаю, что здесь может быть потенциальная ошибка, назначая то, что может быть копией массива, но я признаю, что я не совсем понимаю эту проблему. Здесь, по крайней мере, я вижу, что задание работает. EDIT Хотя теперь я вижу, что использование любого из них в цикл исправляет проблему:
df.loc[i,col] = val
df.at[i,col] = val
Я не знаю достаточно о реализации, чтобы диагностировать это. Может ли кто-нибудь воспроизвести это? Это то, чего вы ожидаете? Что я делаю не так? Спасибо!
Что такое 'iterGet' и' iterLocSet'? – BrenBarn
Возможно, вы захотите посмотреть [этот вопрос] (http://stackoverflow.com/questions/22869893/assign-value-to-subset-of-rows-in-pandas-dataframe). – BrenBarn