反复删除linregress Pandas的多个数据点

时间:2018-10-01 00:42:17

标签: python python-3.x pandas pandas-groupby itertools

数据集优先/输出优先:

Dataset

我需要迭代地删除多个数据点以获得斜率。注释部分说明删除哪些数据点以获得斜率。

我仅用于删除一个数据点的代码如下:

import numpy as np
import pandas as pd
from scipy import stats

df=pd.read_excel('I:/Python/Data/trial.xlsx')

grouped = df.groupby('TestEvent')
df["slope"] = np.NaN
for test_event, g in grouped:
    print('TestEvent: {}'.format(test_event))
    for i in g.index:
        others = g.loc[g.index != i, ["x-axis", "y-axis"]]
        slope, intercept, r_value, p_value, std_err = stats.linregress(others)
        print ("slope", slope, 'for data without pair', i)
        df.loc[i, "slope"] = slope

df.to_excel('trial4.xlsx')

使用上面的代码(n = 1),由于一次删除了一个数据点,我可以进入所有10个斜率。 __ 现在,我需要删除两个数据点(或n> 1),并对两个序列(111和112)保持一个恒定,如图中所示。

每个序列最终将给出90个斜率数据点(0,.... 9重复9次)。

最后,在输出数据框中,每个序列将有90个斜率值。

在所有最终数据帧中,斜率均为180(对于序列111和112)

感谢您的阅读。在这方面的任何帮助深表感谢。

1 个答案:

答案 0 :(得分:0)

使用itertools.combinations获取每种情况下要删除的行的列表。

import numpy as np
import pandas as pd
from itertools import combinations
...
slopes = pd.DataFrame(columns=["Test Event", "Removed 1", "Removed 2", "Slope"])    
for test_event, g in grouped:
    print('TestEvent: {}'.format(test_event))
    for rows_to_drop in combinations(g.index, 2):
        others = g[["x-axis", "y-axis"]].drop(list(rows_to_drop))
        slope, intercept, r_value, p_value, std_err = stats.linregress(others)
        print ("slope", slope, 'for data without rows', rows_to_drop)
        slopes.append({"Test Event": test_event,
                    "Removed 1": rows_to_drop[0],
                    "Removed 2": rows_to_drop[1],
                    "Slope": slope}])

请注意,每个序列只有45个唯一值,而不是90,因为删除(0,1)与删除(1,0)相同。它将斜率存储在单独的新数据框中。