为熊猫数据框中的每个现有变量从行创建新变量

时间:2019-05-15 09:57:09

标签: python pandas dataframe

我有一个看起来像这样的数据框:

0  target_year ID   v1  v2  
1  2000         1  0.3   1
2  2000         2  1.2   4
...
10 2001         1    3   2
11 2001         2    2   2

我想要以下输出:

0   ID   v1_1  v2_1  v1_2  v2_2  
1    1    0.3     1     3     2 
2    2    1.2     4     2     2

您是否知道该怎么做?

3 个答案:

答案 0 :(得分:4)

您可以使用ID中的pd.pivot_table作为列的GroupBy.cumcount

然后,我们可以将列表理解与f-strings结合使用,将MultiIndex标头合并到单个级别:

cols = df.groupby('ID').ID.cumcount() + 1
df_piv = (pd.pivot_table(data = df.drop('target_year', axis=1)[['v1','v2']],
                         index = df.ID, 
                         columns = cols)
df_piv.columns = [f'{i}_{j}' for i,j in df_piv.columns]


     v1_1  v1_2  v2_1  v2_2
ID                        
1    0.3   3.0     1     2
2    1.2   2.0     4     2

答案 1 :(得分:2)

GroupBy.cumcount用于计数器列,用DataFrame.set_indexDataFrame.unstack进行整形,最后在列表理解和f-string中展平:

g = df.groupby('ID').ID.cumcount() + 1

df = df.drop('target_year', axis=1).set_index(['ID', g]).unstack()
df.columns = [f'{a}_{b}' for a, b in df.columns]
df = df.reset_index()
print (df)
   ID  v1_1  v1_2  v2_1  v2_2
0   1   0.3   3.0     1     2
1   2   1.2   2.0     4     2

答案 2 :(得分:0)

如果您的数据仅用了两年,您也可以merge

cols = ['ID','v1', 'v2']
df[df.target_year.eq(2000)][cols].merge(df[df.target_year.eq(2001)][cols],
                                 on='ID',
                                 suffixes=['_1','_2'])

输出

    ID  v1_1    v2_1    v1_2    v2_2
0   1   0.3     1       3.0     2
1   2   1.2     4       2.0     2