【问题标题】:Python Pandas Groupby Resetting Values Based on IndexPython Pandas Groupby根据索引重置值
【发布时间】:2016-12-30 19:57:15
【问题描述】:

所以我有一个数据框,其中包含一些我想要修复的错误信息:

import pandas as pd
tuples_index = [(1,1990), (2,1999), (2,2002), (3,1992), (3,1994), (3,1996)]
index = pd.MultiIndex.from_tuples(tuples_index, names=['id', 'FirstYear'])
df = pd.DataFrame([2007, 2006, 2006, 2000, 2000, 2000], index=index, columns=['LastYear'] )


df
Out[4]: 
              LastYear
id FirstYear          
1  1990           2007
2  1999           2006
   2002           2006
3  1992           2000
   1994           2000
   1996           2000

id 指的是一个企业,这个 DataFrame 是一个更大的示例切片的一个小示例切片,它显示了一个企业如何移动。每条记录都是一个独特的位置,我想捕捉它在那里的第一年和去年。当前的“LastYear”对于只有一项记录的企业准确,对于有多个记录的企业的最新记录准确。 df最后应该是这样的:

              LastYear
id FirstYear          
1  1990           2007
2  1999           2002
   2002           2006
3  1992           1994
   1994           1996
   1996           2000

而我为得到它所做的事情非常笨重:

multirecord = df.groupby(level=0).filter(lambda x: len(x) > 1)
multirecord_grouped = multirecord.groupby(level=0)

ls = []
for _, group in multirecord_grouped:
    levels = group.index.get_level_values(level=1).tolist() + [group['LastYear'].iloc[-1]]
    ls += levels[1:]

multirecord['LastYear'] = pd.Series(ls, index=multirecord.index.copy())
final_joined = pd.concat([df.groupby(level=0).filter(lambda x: len(x) == 1),multirecord]).sort_index()

有没有更好的办法?

【问题讨论】:

    标签: python pandas group-by pandas-groupby


    【解决方案1】:
    shift_year = lambda df: df.index.get_level_values('FirstYear').to_series().shift(-1)
    df.groupby(level=0).apply(shift_year) \
        .combine_first(df.LastYear).astype(int) \
        .rename('LastYear').to_frame()
    

    【讨论】:

    • 除了你,还有谁可以用一行代码完成所有这些工作?
    • 很抱歉从一开始就没有提到这一点,但是正在对其进行操作的数据帧约为 5400 万行。这段代码非常优雅,但运行需要几个小时。你能想到什么可以加快速度吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2016-10-10
    • 2019-03-22
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多