如何从 Python 3.5 中的数据框中找到最大值的确切位置-修改

Posted

技术标签:

【中文标题】如何从 Python 3.5 中的数据框中找到最大值的确切位置-修改【英文标题】:how to find the exact location of maximum value from data frame in Python 3.5- modified 【发布时间】:2016-09-22 02:58:29 【问题描述】:

我在 Python 3.5 中有一个 DataFrame,如:

In [1]:tway5new.info()
<class 'pandas.core.frame.DataFrame'>
 Index: 44 entries,  to VOI
 Columns: 43802 entries, 2011-01-01 00:00:00 to 2015-12-31 23:00:00
 dtypes: int64(43802)
 memory usage: 14.7+ MB

这个数据框的列名是:

In [2]:tway5new.columns
Out[2]: 
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 01:00:00',
           '2011-01-01 02:00:00', '2011-01-01 03:00:00',
           ...
           '2015-12-31 20:00:00', '2015-12-31 21:00:00',
           '2015-12-31 22:00:00', '2015-12-31 23:00:00'],
          dtype='datetime64[ns]', name='timenew', length=43802, freq=None) 

我想把这个 DataFrame 子集化成一系列相对较小的数据框,即每个小数据框只包含一个典型的日记录,例如: 第一个小数据帧包含从“2011-01-01 00:00:00”到“2011-01-01 23:00:00”的信息,第二个小数据帧包含从“2011-01-02 00:00”开始的信息: 00' to '2011-01-02 23:00:00', ....直到第 1826 个小数据帧包含从 '2015-12-31 00:00:00' 到 '2015-12-31 23:00' 的信息:00'。

根据@EdChum的帮助,我尝试了以下代码:

df = tway5new.T 
df.resample('d')
demean = lambda x: abs(x - x.mean())
Asub=df.groupby([df.index.year, df.index.month, df.index.day]).transform(demean)
#TO obtain the absolute difference between hours record and average hours record for each column###
Asubmax=Asub.groupby([df.index.year, df.index.month, df.index.day]).max()
AsubmaxID=Asubmax.idxmax(axis=1)

这给出了跨列的每个典型日期的最大值索引,即从 2011-01-01 到 2015-12-31:

with pd.option_context('display.max_rows',10,'display.max_columns',6):
    print (AsubmaxID)
2011  1   1     UNF
          2     NAT
          3     NAT
          4     NAT
          5     NAT

2015  12  27    NAT
          28    NAT
          29    NAT
          30    NAT
          31    GOA
dtype: object


BmaxID=Asub.groupby([df.index.year, df.index.month, df.index.day]).idxmax(axis=1)

这给出了跨列的每个小时记录的最大值的索引,即从 2011-01-01 00:00:00 到 2015-12-31 23:00:00:

with pd.option_context('display.max_rows',10,'display.max_columns',6):
    print (BmaxID)
          timenew            
2011  1   1   2011-01-01 00:00:00    UNF
              2011-01-01 01:00:00    NAT
              2011-01-01 02:00:00    RTF
              2011-01-01 03:00:00    UNF
              2011-01-01 04:00:00    NAT

2015  12  31  2015-12-31 19:00:00    NAT
              2015-12-31 20:00:00    NAT
              2015-12-31 21:00:00    GOA
              2015-12-31 22:00:00    NAT
              2015-12-31 23:00:00    GOA
dtype: object

现在,如何找到具有精确小时记录的每个典型日期的最大值索引,例如,我知道第一个日期 2011-01-01 的总体最大值索引是 UNF 列,但我怎么能获取 2011-01-01 这个 UNF 列的准确小时记录,即哪个小时记录(2011-01-01 00:00:00 或 2011-01-01 03:00:00)具有最大值?

非常感谢

【问题讨论】:

【参考方案1】:

IIUC 最好将列设为索引,然后您可以resample 或当天过滤:

df = tway5new.T

然后你下采样

df.resample('d')

或当天的团体:

df.groupby([df.index.year, df.index.month, df.index.day])

【讨论】:

谢谢@EdChum。正如你所建议的,我找到了另一个解决方案:y1=tway5new.filter(like='2011-01-01') 这听起来不是很动态,因为它要求您每次都传递过滤器字符串 在我获得的每个小数据子集之后,我将对这样的小数据帧进行行均值。所以我想我会创建循环来定义迭代 i 从 2011-01-01 到 2015-12-31 你可以通过df.groupby([df.index.year, df.index.month, df.index.day]).mean()实现同样的目标 太棒了。我试过你的建议。我获得了 1826 行乘 44 列的数据框,其中元素是平均值。但是,在典型的一天下,我需要使用特定分类变量的重复次数(即df中每一列的小时记录)从它们对应的平均值中减去它们的差值,然后找出哪一列的差值绝对最大,最后,用原来那一栏每小时记录的重复次数除以典型一天的总重复次数。每个典型日子的这些分数是我的最终结果。

以上是关于如何从 Python 3.5 中的数据框中找到最大值的确切位置-修改的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中的数据框中找到列的最大值?

python - 如何从具有另一个属性的属性中找到最大值作为Python中的要求? [复制]

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

如何从数据框中的分类变量中找到定量变量的平均值? [复制]

如何在python数据框中找到两个时间差之间的持续时间

如何在熊猫数据框中找到每个月的“n”个最大值? [复制]