为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2023-08-22 10:42:59
这是 Python/ Pandas 的延续:Finding a left and right max我有一个数据框,其中包含数据时间表。这是一个例子:idx Q12000      Q22000      Q32000      Q42000      Q12001      Q22001      Q32001     Q42001      Q12002      Q22002      Q32002      Q420020   4085280.0   4114911.0   4108089.0   4111713.0   4055699.0   4076430.0   4043219.0  4039370.0   4201158.0   4243119.0   4231823.0   4254681.01   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 StringIOimport pandas as pddef 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 qtrdef 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')我遇到的麻烦是第二行。将最低点作为第一列没有意义,因此我更改了上面的代码,只获取前几列之后的最低点。
查看完整描述

1 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

您可以仅在第一列之后进行选择.iloc[:1,:],并使用一堆 pandas 方法,例如.min、.max、等:idxminidxmax


df['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_new

Out[1]: 

         nadir  nadir_qtr   pre_peak  pre_peak_qtr  post_peak  post_peak_qtr

idx                                                                         

0    4039370.0          7  4114911.0             1  4254681.0             11

1      21566.0          1    21226.0             0    23232.0              5

2      95958.0          7   103054.0             5   123064.0              9

3      22080.0         11    24186.0             2    22080.0             11

4       6722.0          7     7906.0             1     8326.0             11


查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 4129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信