将新的栏目作为其他栏目的组合来生成[英] Generate new columns as a combination of other columns

本文是小编为大家收集整理的关于将新的栏目作为其他栏目的组合来生成的处理方法,想解了将新的栏目作为其他栏目的组合来生成的问题怎么解决?将新的栏目作为其他栏目的组合来生成问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个 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

我该如何做到这一点?

推荐答案

从你的示例数据开始

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)

从您的值列中创建一个系列,并按标识符和 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

Unstack 它,并将它加入到 '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 没有指定任何值.

本文地址:https://www.itbaoku.cn/post/1728070.html