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)
希望对你有帮助
我现在的数据框是这样的:
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)
希望对你有帮助