我想重塑以下数据框:
index id numbers 1111 5 58.99 2222 5 75.65 1000 4 66.54 11 4 60.33 143 4 62.31 145 51 30.2 1 7 61.28
重新塑造的数据框应如下所示:
id 1 2 3 5 58.99 75.65 nan 4 66.54 60.33 62.31 51 30.2 nan nan 7 61.28 nan nan
我使用以下代码执行此操作。
import pandas as pd
dtFrame = pd.read_csv("data.csv")
ids = dtFrame['id'].unique()
temp = dtFrame.groupby(['id'])
temp2 = {}
for i in ids:
temp2[i]= temp.get_group(i).reset_index()['numbers']
dtFrame = pd.DataFrame.from_dict(temp2)
dtFrame = dtFrame.T
虽然上面的代码解决了我的问题,但有一种更简单的方法来实现这一点。我尝试了Pivot表,但它没有解决问题,也许它需要在每个组中具有相同数量的元素。或者可能有另一种我不知道的方式,请分享您的想法。
答案 0 :(得分:2)
In [69]: df.groupby(df['id'])['numbers'].apply(lambda x: pd.Series(x.values)).unstack()
Out[69]:
0 1 2
id
4 66.54 60.33 62.31
5 58.99 75.65 NaN
7 61.28 NaN NaN
51 30.20 NaN NaN
这与你正在做的非常相似,只是循环被apply
取代。 pd.Series(x.values)
有一个索引,默认情况下的范围是从0
开始的整数。索引值成为列名(上图)。各种群体可能具有不同的长度并不重要。 apply
方法为您排列各种索引(并使用NaN
填充缺失值)。多么方便!
我学会了这个技巧here。