在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]

Posted

技术标签:

【中文标题】在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]【英文标题】:Returning last row of each group meeting logical index condition in pandas multindexed dataframe [duplicate] 【发布时间】:2020-04-26 11:02:11 【问题描述】:

希望返回一个数据框,其中包含每个组的最后一行(具有最近日期索引的行),其中多索引的第二级由逻辑索引条件过滤。

下面是一个玩具示例,可以更好地解释:

import numpy as np
import pandas as pd
from datetime import datetime

dates  = pd.date_range(start='1/1/2018', end='1/4/2018').to_pydatetime().tolist() * 2
ids    = ['z7321', 'z7321', 'z7321', 'z7321', 'b2134', 'b2134', 'b2134', 'b2134']

arrays = [ids, dates]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['key', 'date'])

df = pd.DataFrame(data=np.random.randn(len(index)), index=index, columns=['change'])

print(df)

                   change
key   date
z7321 2018-01-01 -0.701605
      2018-01-02 -0.934580
      2018-01-03  0.186554
      2018-01-04  0.417024
b2134 2018-01-01  0.682699
      2018-01-02 -0.913633
      2018-01-03  0.330347
      2018-01-04 -0.706429

条件是返回df[df.index.get_level_values(1) <= datetime(2018, 1, 2)]所在的最后一行

所需的输出如下所示:

                   change
key   date
z7321 2018-01-02 -0.934580
b2134 2018-01-02 -0.913633

其他注意事项:

    不能使用df[df.index.get_level_values(1) == datetime(2018, 1, 2)] 直接选择行,因为第二个索引级别(日期级别)可能不包含与datetime(2018, 1, 2) 的指定值完全匹配的日期 日期索引可能在关键组/索引中包含不同的值。即“z7321”在二级索引中的日期可能与“b2134”不同

【问题讨论】:

这能回答你的问题吗? Get only the first and last rows of each group with pandas 参见:.tail() 是的,它确实有助于回答这个问题,我在搜索中没有遇到它。应用 .tail(1) 也可以。 【参考方案1】:

在编写玩具示例时,我最终找到了一种获得所需输出的方法。希望这个解决方案对其他人有帮助,或者可以改进。

以下提供了所需的输出:

df1 = df[df.index.get_level_values(1) <= datetime(2018, 1, 2)].groupby(level='key', as_index=False).nth(-1)
print(df1)

                   change
key   date
z7321 2018-01-02 -0.934580
b2134 2018-01-02 -0.913633

这也适用于第二个索引级别在第一级组中不一致的情况:

import numpy as np
import pandas as pd
from datetime import datetime

dates = pd.date_range(start='1/1/2018', end='1/4/2018').to_pydatetime().tolist()
dates += pd.date_range(start='12/29/2017', end='1/1/2018').to_pydatetime().tolist()

ids   = ['z7321', 'z7321', 'z7321', 'z7321', 'b2134', 'b2134', 'b2134', 'b2134']

arrays = [ids, dates]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['key', 'date'])

df = pd.DataFrame(data=np.random.randn(len(index)), index=index, columns=['change'])
print(df)

                    change
key   date
z7321 2018-01-01 -1.420757
      2018-01-02 -0.297835
      2018-01-03  0.693520
      2018-01-04  0.909420
b2134 2017-12-29 -1.577685
      2017-12-30  0.632395
      2017-12-31  1.158273
      2018-01-01 -0.242314


df1 = df[df.index.get_level_values(1) <= datetime(2018, 1, 2)].groupby(level='key', as_index=False).nth(-1)
print(df1)

                    change
key   date
z7321 2018-01-02 -0.297835
b2134 2018-01-01 -0.242314

【讨论】:

以上是关于在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

访问熊猫数据框中内部多索引级别的最后一个元素

熊猫将第一个多索引转换为行索引,将第二个多索引转换为列索引

如何更改多索引数据框中的索引

熊猫使用多索引选择第二个索引的最后一行

删除每个索引的多索引熊猫数据帧的最低五个值

如何将多索引列转换为熊猫数据框的单索引列?