【问题标题】:How to use chain for several transformations, including creating new column? [closed]如何使用链进行多种转换,包括创建新列? [关闭]
【发布时间】:2022-12-09 23:44:30
【问题描述】:

编辑以符合规则:

如何链接以下代码?我似乎无法添加带有链的新列。

数据集的输入列:

订单,ITEM_SERIAL,日期

%%time

df = Dataset.groupby(['ORDER', pd.Grouper(key='DATE', freq='7d')]).agg(Min=('DATE','min'), Max=('DATE','max'), ITEM_SERIAL_Min=('ITEM_SERIAL','first'), ITEM_SERIAL_Max=('ITEM_SERIAL','last')).reset_index()
                     
df['DIFFERENCE'] = df['Max'] - df['Min']
df = df[df['DIFFERENCE']!='0s'].sort_values('DIFFERENCE')
df = df.drop('DATE', axis=1)
df['ORDER'] = df['ORDER'] + '_' + df['Min'].map(str).str[:10]

df

df 的输出列:

ORDER、Min、Max、ITEM_SERIAL_Min、ITEM_SERIAL_Max、DIFFERENCE

【问题讨论】:

    标签: python pandas dataframe group-by method-chaining


    【解决方案1】:

    这个问题非常主观,但您可以以格式化的方式链接所有操作(并添加 cmets!):

    df = (
        Dataset
        # groupby and aggregate ...
        .groupby(['ORDER', pd.Grouper(key='DATE', freq='7d')], as_index=False)
        .agg(
            Min=('DATE', 'min'),
            Max=('DATE', 'max'),
            ITEM_SERIAL_Min=('ITEM_SERIAL', 'first'),
            ITEM_SERIAL_Max=('ITEM_SERIAL', 'last'),
        )
        # compute DIFFERENCE ...
        .assign(DIFFERENCE=lambda d: d['Max'] - d['Min'])
        # filter ...
        .loc[lambda d: d['DIFFERENCE'] != '0s']
        # sort rows by ascending DIFFERENCE
        .sort_values('DIFFERENCE')
        # remove DATE column
        .drop('DATE', axis=1)
        # compute ORDER ...
        .assign(ORDER=lambda d: d['ORDER'] + '_' + d['Min'].astype(str).str[:10])
    )
    

    【讨论】:

    • 我同意这是非常主观的(这解释了我猜的反对票)但是你给了我一个很好的起点,因为我正在努力链接过滤器和创建新列。谢谢你的回答。
    • 删除“日期”行给了我一个错误。当我删除该行并再次运行代码时,发现结果不包括“日期”。我很困惑
    • 尝试删除 groupby 中的 as_index=False 并像最初那样使用 reset_index()。现在这不是真正的原始问题,如果你想让我确保所有代码都正常工作,也许你应该提供一个清晰的可重现的输入/输出;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2016-03-06
    • 2013-11-26
    • 2021-08-19
    • 2022-10-13
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多