【问题标题】:pandas pivot based on unique values and criteriapandas 基于独特的价值观和标准
【发布时间】:2021-09-07 08:54:25
【问题描述】:

我有这个数据框:

df_in = pd.DataFrame({'id': ['123', '123', '123', '123', '123', '456'],
 'ven_group': ['a', 'a', 'a', 'b', 'f', 'f'],
 'date': ['1/1/21', '2/1/21', '3/1/21', '1/1/21', '1/1/21', '1/1/21']
 })

我有以下条件(这是我需要的 ven_group 列表):

ven_group_li = ['a', 'b', 'c']

这是我需要的输出:

基本上它是一个数据透视表,每个唯一的 id 作为一行,如果它在 ven_group_li 中,每个 ven_group 名称,然后找到这个 ven_group 的最小和最大日期,如果 ven_group 名称不在列表中,它将填充带有 NaN 的行。

我试过这个,但我不知道如何修改它以包含我的 ven_group 要求并具有最小、最大日期:

df_out1 = df_in.groupby('id')['ven_group'].apply(lambda x: pd.DataFrame(x.unique()).T).reset_index(level=1, drop=True)

【问题讨论】:

    标签: python pandas group-by pivot-table apply


    【解决方案1】:

    一种方式:

    unique_id = df.id.unique()
    ven_group_li = ['a', 'b', 'c']
    df = df[df.ven_group.isin(ven_group_li)]
    df1 = df.groupby(['id', 'ven_group']).agg(
        [min, max]).reset_index(-1).groupby(level=0).agg(list)
    df1.columns = ['name', 'max', 'min']
    df2 = pd.concat(
        [df1[c].apply(pd.Series).add_prefix("ven_" + c + "_") for c in df1], axis=1
    )
    df2 = df2[sorted(df2.columns, key=lambda x: x.split('_')[-1])].reindex(unique_id)
    

    输出:

        ven_name_0 ven_max_0 ven_min_0 ven_name_1 ven_max_1 ven_min_1
    id                                                               
    123          a    1/1/21    3/1/21          b    1/1/21    1/1/21
    456        NaN       NaN       NaN        NaN       NaN       NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多