python - 将解决方案应用于实际数据时结果不正确

标签 python pandas numpy dataframe

我尝试将此问题中提供的解决方案应用于我的真实数据:Selecting rows in a MultiIndexed dataframe 。不知怎的,我无法得到它应该给出的结果。我已附上可供选择的数据框以及结果。

我需要什么;

应返回第 3、11 和 12 行(当您连续添加 4 列时,也应选择第 12 行。现在不是)。

    df_test = pd.read_csv('df_test.csv')

    def find_window(df):
        v = df.values
        s = np.vstack([np.zeros((1, v.shape[1])), v.cumsum(0)])

        threshold = 0

        r, c = np.triu_indices(s.shape[0], 1)
        d = (c - r)[:, None]
        e = s[c] - s[r]
        mask = (e / d < threshold).all(1)
        rng = np.arange(mask.shape[0])

        if mask.any():
            idx = rng[mask][d[mask].argmax()]

            i0, i1 = r[idx], c[idx]
            return pd.DataFrame(
                v[i0:i1],
                df.loc[df.name].index[i0:i1],
                df.columns
            )

    cols = ['2012', '2013', '2014', '2015']

    df_test.groupby(level=0)[cols].apply(find_window)

csv_file 在这里:https://docs.google.com/spreadsheets/d/19oOoBdAs3xRBWq6HReizlqrkWoQR2159nk8GWoR_4-g/edit?usp=sharing

编辑:添加了正确的数据帧。 enter image description here

enter image description here

注意:蓝色框 = 应返回的行,黄色框是 < 0(阈值)的连续列值。

最佳答案

我无法找出修改您链接到的原始问题的方法,因为您的解决方案看起来应该有效。然而,这是解决您正在寻找的问题的迭代方法。

import pandas as pd


df_test = pd.read_csv('df_test.csv')
print(df_test.head())
"""

   bins_DO    L  T2011   2011  T2012  2012  T2013   2013  T2014   2014  T2015   2015  Ttotal  total
0        0  IR1      6  -6.06     13 -3.22     12  -1.60      7  14.64     12 -18.20      50 -14.44
1        1  IR1     14 -16.32     12 -6.74     14  -1.22      5   1.58      8  -0.42      53 -23.12
2        2  IR1     10  -9.14     10 -0.42     10  11.84     13  -5.74      7  -3.10      50  -6.56
3        3  IR1      9 -13.78     14 -3.14     10  -2.48      6  -0.02      5  -4.78      44 -24.20
4        4  IR1      6   0.54      9 -9.40     15 -11.20      7   0.68      9  12.04      46  -7.34

"""
cols = ['2012', '2013', '2014', '2015']


def process_df(df: pd.DataFrame, cols: list, threshold: float):
    # initialize the benchmark
    # this gets reset any time the newest row fails the threshold test
    base_vals = [0 for _ in cols]
    keep_col = []

    for row in df[cols].values:
        # by default, keep the row
        keep_row = True
        for x in range(len(cols)):
            # if it fails on the row, then make keep row false
            if row[x] + base_vals[x] > threshold:
                keep_row = False

        keep_col.append(keep_row)

        if keep_row:
            # if we were happy with those results, then keep adding the column values to the base_vals
            for x in range(len(cols)):
                base_vals[x] += row[x]
        else:
            # otherwise, reset the base vals
            base_vals = [0 for _ in cols]

    # only keep rows that we want
    df = df.loc[keep_col, :]

    return df


new_df = process_df(df = df_test, cols = cols, threshold = 0)
print(new_df)

"""

    bins_DO    L  T2011   2011  T2012   2012  T2013   2013  T2014   2014  T2015  2015  Ttotal  total
3         3  IR1      9 -13.78     14  -3.14     10  -2.48      6  -0.02      5 -4.78      44 -24.20
11       11  IR1      7   7.10     10 -10.04      7 -10.60     17  -5.56     11 -8.44      52 -27.54
12       12  IR1     10  -0.28      7  -7.30      8   5.96      8 -12.58     10 -6.86      43 -21.06

"""

关于python - 将解决方案应用于实际数据时结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42094873/

相关文章:

python - 将两个图合并为一个图

python - 方法类似于函数中的参数

python - 使用 Python JAX/Autograd 计算向量值函数的雅可比行列式

python - 创建具有线性渐变的图像 mask

python-2.7 - 使用 numpy 从偏态正态分布生成 N 个随机数

python - 如何在 Python 中设置辅助 y 轴

python - sqlite3.操作错误

javascript - 如何在 Flask 中使用 JSON 对象

python - 如何使用 mysql.connector (Python) 执行简单命令

python - 如何在 pandas 中将 .loc 与 groupby 和两个条件一起使用