Python 将新列作为其他列的组合生成

Python 将新列作为其他列的组合生成,python,pandas,Python,Pandas,我有一个DataFrame,它在列中有标识符的几个组件,在另一列中有一个与标识符关联的值。我希望能够创建n个列,这样每个列都是标识参数 foo Type ID Index Value 25090 x A 0 0 23272000 25090 x A 0 0 23272000 25091 x A

我有一个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\u ID\u Index
groupings(我可以通过groupby获得),每列都有各自的值。我希望该值与foo关联

i、 e


如何实现这一点?

从您的示例数据开始

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
row-wise连接每行的标识符

In [4]: identifier = df[['Type', 'ID', 'Index']].apply(
             lambda x: '_'.join(map(str, x)), axis=1)
从值列创建一个系列,并通过标识符和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”上的原始数据帧

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
中。这是必要的。如果在数据集中的任何位置对同一idenitifer有不同的值,您将遇到麻烦


次要问题:示例输出中缺少一行(25094)。此外,我的输出中的NaN也是有意义的:当foo='y'时,A_1_0没有指定任何值。

如果数据集中的任何地方对同一idenitifer有不同的值,您将遇到麻烦。是的。我的测量可能会有噪音,因此这将是一个问题。什么是一个优雅的平均方法?我想我明白了。下面是我所做的:v=v.groupby(v.index).mean()v.index=pd.MultiIndex.from_tuples(v.index)
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