pandas 基于唯一值和标准的数据透视

pandas pivot based on unique values and criteria

我有这个数据框:

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']

这是我需要的输出:

基本上它是一个枢轴 table,如果每个 ven_group 名称在 ven_group_li 中,则每个唯一 ID 作为一行,然后找到此 [的最小和最大日期=30=],如果 ven_group name 不在列表中,它将用 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)

单向:

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