#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я изучаю python и придумал способ вычисления значений строка за строкой, но я уверен, что есть более элегантное (и более быстрое) решение. Вот простой пример:
df = pd.DataFrame(np.random.rand(10,3), columns=list('abc'))
df.head()
a b c
0 0.207455 0.257266 0.453369
1 0.518193 0.816898 0.141986
2 0.430085 0.490554 0.797655
3 0.369860 0.251664 0.777059
4 0.390059 0.983218 0.966202
df['d']=''
df['e']=''
for i in range(1,len(df)):
df['d'][i]= sqrt((df['a'][i]-df['b'][i])**2 (df['a'][i-1]-df['b'][i-1])**2)
df['e'][i]= (df['c'][i]-df['c'][i-1])*1609
df.head()
a b c d e
0 0.207455 0.257266 0.453369
1 0.518193 0.816898 0.141986 0.30283 -501.015
2 0.430085 0.490554 0.797655 0.304765 1054.97
3 0.369860 0.251664 0.777059 0.132766 -33.1396
4 0.390059 0.983218 0.966202 0.60482 304.331
Есть ли лучший способ сделать это? Я работаю с некоторыми большими наборами данных, и для его запуска требуется некоторое время.
Ответ №1:
Да, у нас есть shift
цикл with diff
и нет for
df['d'] = ((df['a'] - df['b']) ** 2 (df['a'].shift() - df['b'].shift()) ** 2)**0.5
df['e'] = (df['c'].diff()) * 1609
df
a b c d e
0 0.207455 0.257266 0.453369 NaN NaN
1 0.518193 0.816898 0.141986 0.302830 -501.015247
2 0.430085 0.490554 0.797655 0.304764 1054.971421
3 0.369860 0.251664 0.777059 0.132766 -33.138964
4 0.390059 0.983218 0.966202 0.604821 304.331087