猿问

计算 1. 最小值、2. 最小值左侧的列的最大值以及 3. 最小值右侧的列的最大值

这是 Python/ Pandas 的延续:Finding a left and right max

我有一个数据框,其中包含数据时间表。这是一个例子:

idx Q12000      Q22000      Q32000      Q42000      Q12001      Q22001      Q32001     Q42001      Q12002      Q22002      Q32002      Q42002


0   4085280.0   4114911.0   4108089.0   4111713.0   4055699.0   4076430.0   4043219.0  4039370.0   4201158.0   4243119.0   4231823.0   4254681.0

1   21226.0     21566.0     21804.0     22072.0     21924.0     23232.0     22748.0    22258.0     22614.0     22204.0     22500.0     22660.0     

2   96400.0     102000.0    98604.0     97086.0     96354.0     103054.0    97824.0    95958.0     115938.0    123064.0    120406.0    120648.0   

3   23820.0     24116.0     24186.0     23726.0     23504.0     23574.0     23162.0    23078.0     22306.0     22334.0     22152.0     22080.0     

4   7838.0      7906.0      7714.0      7676.0      7480.0      7520.0      7102.0     6722.0      8324.0      8166.0      8208.0      8326.0   

为了进行分析,我需要计算每行的以下值:

  • nadir:最低点(分钟)

  • nadir_qtr:最低点发生的季度

  • 峰值前:最低点之前的最高点

  • pre-peak_qtr:预峰值发生的季度

  • 峰后:最低点后的最高点

  • post-peak_qtr:后峰值发生的季度

在上一篇文章的帮助下,我使用了以下辅助函数:

from io import StringIO

import pandas as pd


def calc_nadir(s):

    assert isinstance(s, pd.Series)

    return s.min()


def calc_nadir_qtr(s):

    return s.argmin()


def calc_pre_peak(s):

    return s[ : s.argmin()].max()


def calc_pre_peak_quarter(s):

    try:

        qtr = s[ : s.argmin()].argmax()

    except:

        qtr = None

    return qtr


def calc_post_peak(s):

    return s[s.argmin() : ].max()


def calc_post_peak_qtr(s):

    return s[s.argmin() : ].argmax() + s.argmin()


nadir = df.apply(lambda x: calc_nadir(x), axis=1).rename('nadir')

nadir_qtr = df.apply(lambda x: calc_nadir_qtr(x), axis=1).rename('nadir_qtr')


我遇到的麻烦是第二行。将最低点作为第一列没有意义,因此我更改了上面的代码,只获取前几列之后的最低点。



拉丁的传说
浏览 4193回答 1
1回答

DIEA

您可以仅在第一列之后进行选择.iloc[:1,:],并使用一堆 pandas 方法,例如.min、.max、等:idxminidxmaxdf['nadir'] = df.iloc[:,1:].min(axis=1)df['nadir_qtr'] = df.iloc[:,1:].idxmin(axis=1).apply(lambda x: df.columns.get_loc(x))df['new'] = [df.iloc[i].values for i in df.index]df['pre_peak'] = df.apply(lambda x: max(x['new'][0:x['nadir_qtr']]), axis=1)df['post_peak'] = df.apply(lambda x: max(x['new'][x['nadir_qtr']:]), axis=1)df['pre_peak_qtr'] = pd.Series([s[i] for i, s in zip(df.index, df['pre_peak'].apply(    lambda x: [i for i in (df.iloc[:,0:-6] == x)               .idxmax(axis=1)]))]).apply(lambda x: df.columns.get_loc(x))df['post_peak_qtr'] = pd.Series([s[i] for i, s in zip(df.index, df['post_peak'].apply(    lambda x: [i for i in (df.iloc[:,0:-6] == x)               .idxmax(axis=1)]))]).apply(lambda x: df.columns.get_loc(x))df_new = df[['nadir', 'nadir_qtr', 'pre_peak', 'pre_peak_qtr', 'post_peak', 'post_peak_qtr']]df_newOut[1]:          nadir  nadir_qtr   pre_peak  pre_peak_qtr  post_peak  post_peak_qtridx                                                                         0    4039370.0          7  4114911.0             1  4254681.0             111      21566.0          1    21226.0             0    23232.0              52      95958.0          7   103054.0             5   123064.0              93      22080.0         11    24186.0             2    22080.0             114       6722.0          7     7906.0             1     8326.0             11
随时随地看视频慕课网APP

相关分类

Python
我要回答