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
我有这个数据框:
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