Python数据框自定义应用功能

时间:2020-04-22 05:56:33

标签: python dataframe

我想在下面使用数据框和自定义应用功能在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.1intercept=0.0,而“ Nov 2018”行的x:[1,2,3], y:[0.5,1.0,1.5]应该给出slope=0.5和{{1 }}。

我从列名获取x值。预先感谢。

2 个答案:

答案 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()