根据另外两列拆分列

时间:2014-03-08 14:23:31

标签: pandas

我有以下数据框:

df 
     resid      familyid age
54  -0.855952    1028/2  39
55  -0.733972    1028/2  40
56  -0.821011    1028/2  41
57  -0.759187    1028/2  42
58  -0.753066    1028/2  43
65   1.268154    1028/2  35
66   1.214893    1028/2  36
...etc

resid 包含N个浮点数。 familyid 包含不同的标识符(键),如上所示,age包含10个值:从35到44.每个 familyid 在此数据中表示两次(即它们是兄弟姐妹),我希望将此数据帧转换为2 * 10列数据帧,其中:

第一列包含第一个 age 35个兄弟姐妹的所有 resid 值,第二列包含第二个 resid 值em> age 35个兄弟姐妹,第三列包含第一个 age 36兄弟等的所有 resid 值。

我希望这很清楚。谢谢

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是tag每个兄弟姐妹为1(第一个)或2(第二个),然后转动;例如以

开头
>>> df
    resid familyid  age
0   -0.86   1028/2   39
1   -0.73   1028/2   40
2   -0.82   1028/2   41
3   -0.76   1028/2   42
4   -0.75   1028/2   43
5    1.27   1028/2   35
6    1.21   1028/2   36
7    1.71   1028/2   39
8    1.47   1028/2   40
9    1.64   1028/2   41
10   1.52   1028/2   42
11   1.51   1028/2   43
12  -2.54   1028/2   35
13  -2.43   1028/2   36

标记部分可以通过

完成
>>> tagfn = lambda x: 1 + np.arange(len(x))
>>> df['tag'] = df.groupby(['familyid', 'age']).transform(tagfn)

然后:

>>> df.pivot_table('resid', 'familyid', ['age', 'tag'])
age         35          36          39          40          41          42          43      
tag          1     2     1     2     1     2     1     2     1     2     1     2     1     2
familyid                                                                                    
1028/2    1.27 -2.54  1.21 -2.43 -0.86  1.71 -0.73  1.47 -0.82  1.64 -0.76  1.52 -0.75  1.51

[1 rows x 14 columns]