我有一个DataFrame,列中包含标识符的几个组件,另一列中包含与标识符关联的值。我希望能够创建n列,使每列都是识别参数。
foo Type ID Index Value
25090 x A 0 0 23272000
25090 x A 0 0 23272000
25091 x A 1 0 22896000
25092 x B 0 1 20048000
25093 y A 0 0 19760000
25092 y B 0 1 20823342
我想让它有n列Type_ID_Index
分组(我可以通过groupby获得),每列都有相应的值。我希望该值与foo相关联。
即
foo A_0_0 A_1_0 B_0_1
25090 x 23272000 22896000 20048000
25090 x 23272000 22896000 20048000
25091 x 23272000 22896000 20048000
25092 x 23272000 22896000 20048000
25093 y 19760000 21568000 20823342
25092 y 19760000 21568000 20823342
我如何做到这一点?
答案 0 :(得分:3)
从您的示例数据开始
In [3]: df
Out[3]:
foo bar Type ID Index Value
25090 x 9 A 0 0 23272000
25090 x 5 A 0 0 23272000
25091 x 3 A 1 0 22896000
25092 x 3 B 0 1 20048000
25093 y 6 A 0 0 19760000
25092 y 4 B 0 1 20823342
通过逐行应用join
来连接每一行的标识符。
In [4]: identifier = df[['Type', 'ID', 'Index']].apply(
lambda x: '_'.join(map(str, x)), axis=1)
从您的Value列创建一个Series,并使用identifer和foo对其进行索引。
In [5]: v = df['Value']
In [6]: v.index = pd.MultiIndex.from_arrays([df['foo'], identifier])
In [7]: v
Out[7]:
foo
x A_0_0 23272000
A_0_0 23272000
A_1_0 22896000
B_0_1 20048000
y A_0_0 19760000
B_0_1 20823342
Name: Value, dtype: int64
将其取消堆叠,然后将其加入'foo'上的原始DataFrame。
In [8]: df[['foo', 'bar']].join(v.drop_duplicates().unstack(), on='foo')
Out[8]:
foo bar A_0_0 A_1_0 B_0_1
25090 x 9 23272000 22896000 20048000
25090 x 5 23272000 22896000 20048000
25091 x 3 23272000 22896000 20048000
25092 x 3 23272000 22896000 20048000
25093 y 6 19760000 NaN 20823342
25092 y 4 19760000 NaN 20823342
请注意,我在重新放置之前删除了v
中的重复项。这很重要。如果数据集中任何位置的同一个标识符都有不同的值,则会遇到麻烦。
小点:您的示例输出有一行(25094),您的示例输入中缺少该行。此外,输出中的NaN是有意义的:当foo ='y'时,A_1_0没有指定值。