pivot pandas dataframe 生成多列

pivot pandas dataframe to generate several columns

我现在的数据框是这样的:

        nut_no   g            grams            label(g)         label(grams)
0       0.0      150          150 No units     Calories(kcal)   Calories        
1       1.0      2g(3% DV)    2 grams(3% DV)   Total Fat(g)     Total Fat(grams)    
2       2.0      30g(10% DV)  30 grams(10% DV) Total Carbs(g)   Total Carbs(grams)
3       3.0      4g           4 grams          Protein(g)       Protein(grams)
4       0.0      300          300 No units     Calories(kcal)   Calories
5       1.0      12g(18% DV)  12 grams(18% DV) Total Fat(g)     Total Fat(grams)
6       2.0      30g(10% DV)  30 grams(10% DV) Total Carbs(g)   Total Carbs(grams)
7       3.0      18g          18 grams         Protein(g)       Protein(grams)

下面是我想要生成的数据帧输出:

    Calories(kcal) Calories     Total Fat(g)  Total Fat(grams)  Total Carbs(g) Total Carbs(grams)  Protein(g)    Protein(grams)    
1   150            150 No units 2g(3% DV)     2 grams(3% DV)    30g(10% DV)  30 grams(10% DV)      4g            4 grams
2   300            300 No units 12g(18% DV)   12 grams(18% DV)  30g(10% DV)  30 grams(10% DV)      18g           18 grams

4 个连续行(第 "nut_no" 列和值 0.0、1.0、2.0、3.0)从起始数据帧组合起来形成输出数据帧中的一行。 "label(g)" 和 "label(grams)" 列中的值成为 "g" 和 "grams" 列中值的 headers 列。我还需要维护顺序,即前 4 行必须成为输出中的第 1 行,接下来的 4 行必须成为第 2 行,依此类推

我已经用 pivot 和 groupby 尝试了几种不同的方法,但我就是找不到自己的方法,所以不胜感激。

我们可以为此使用双枢轴和连接,即

one = df.pivot(values='g',columns='label(g)').apply(lambda x : sorted(x,key=pd.isnull)).dropna()

two = df.pivot(values='grams',columns='label(grams)').apply(lambda x : sorted(x,key=pd.isnull)).dropna()

ndf = pd.concat([one,two],1)

输出:

 Calories(kcal) Protein(g) Total Carbs(g) Total Fat(g)      Calories  \
0            150         4g    30g(10% DV)    2g(3% DV)  150 No units   
1            300        18g    30g(10% DV)  12g(18% DV)  300 No units   

  Protein (grams) Total Carbs(grams)  Total Fat(grams)  
0         4 grams   30 grams(10% DV)    2 grams(3% DV)  
1        18 grams   30 grams(10% DV)  12 grams(18% DV)  

希望对你有帮助