Python 将新列作为其他列的组合生成
我有一个DataFrame,它在列中有标识符的几个组件,在另一列中有一个与标识符关联的值。我希望能够创建n个列,这样每个列都是标识参数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
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