我想在下面使用数据框和自定义应用功能在python中进行操作。
Month,1,2,3,4,5
Oct 2018,0.1,0.2,0.3,0.4,NaN
Nov 2018,0.5,1.0,1.5,NaN,NaN
第一行是列标题。我想进行每一行并进行线性拟合,并填充斜率并截取为单独的列。例如,“ Oct 2018”行的x:[1,2,3,4],y:[0.1,0.2,0.3,0.4]
应该给出slope=0.1
和intercept=0.0
,而“ Nov 2018”行的x:[1,2,3], y:[0.5,1.0,1.5]
应该给出slope=0.5
和{{1 }}。
我从列名获取x值。预先感谢。
答案 0 :(得分:1)
def get_slope_interscept(x):
# Need two valid points to determine slope and interscept
first_index = x[1:,].first_valid_index()
second_index = x[first_index+1:,].first_valid_index()
x1, x2, y1, y2 = first_index, second_index, x[first_index], x[second_index]
slope = (y2-y1)/ (x2-x1)
interscept = y2 - slope*x2
return [slope, interscept]
df.apply(lambda x: pd.Series(get_slope_interscept(x), index=['slope', 'interscept']), axis=1)
如果行中的NaN无效,这也将处理该情况。
答案 1 :(得分:0)
您可以通过使用.stack
并在当月的.groupby
进行一次.sum()
,在{{1}列,并使用.rename
计算斜率。最后,将值发送到列表,以便将其设置回新创建的“坡度”列。对于拦截列,您只需将拦截设置为零即可。
数据:
.eval
代码:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Month':['Oct', 'Nov'],
1: [0.1,0.5],
2: [0.2,1.0],
3: [0.3,1.5],
4: [0.4,np.NaN],
5: [np.NaN,np.NaN]})
输出:
df['Slope'] = pd.DataFrame(df.set_index('Month').stack()).reset_index().groupby('Month').sum().rename(columns={'level_1' : 'x', 0 : 'y'}).eval('Slope = y / x')['Slope'].to_list()