【问题标题】:Combine rows based on index or column根据索引或列组合行
【发布时间】:2018-12-06 19:56:06
【问题描述】:

我有三个数据框:df1、df2、df3。我正在尝试添加 ART_UNIT do df1 的列表。

df1 是 260846 行 x 4 列:

Index    SYMBOL    level  not-allocatable  additional-only
0        A         2             True            False
1        A01       4             True            False
2        A01B      5             True            False
3        A01B1/00  7            False            False
4        A01B1/02  8            False            False
5        A01B1/022 9            False            False
6        A01B1/024 9            False            False
7        A01B1/026 9            False            False

df2 是 941516 行 x 2 列:

Index       CLASSIFICATION_SYMBOL_CD  ART_UNIT
0                     A44C27/00       3715
1                    A44C27/001       2015
2                    A44C27/001       3715
3                    A44C27/001       2615
4                    A44C27/005       2815
5                    A44C27/006       3725
6                    A44C27/007       3215
7                    A44C27/008       3715
8                     F41A33/00       3715
9                     F41A33/02       3715
10                    F41A33/04       3715
11                    F41A33/06       3715
12                    G07C13/00       3715
13                   G07C13/005       3715
14                    G07C13/02       3716

而df3与df2的格式相同,但有673023行x 2列

df2 和 df3 中的 'CLASSIFICATION_SYMBOL_CD' 不是唯一的。

对于 df2 和 df3 中的每个 'CLASSIFICATION_SYMBOL_CD',我想在 df1 'SYMBOL' 中找到相同的字符串,并向 df1 'ART_UNIT' 添加一个新列,其中包含来自 df2 和 df3 的所有 'ART_UNIT'

例如,在 df2 中,'CLASSIFICATION_SYMBOL_CD'A44C27/001 有 ART_UNIT 2015、3715 和 2615。

我想将那些 ART_UNIT 写入 df1 中的正确行,这样读取:

Index    SYMBOL      level  not-allocatable  additional-only  ART_UNIT
211        A44C27/001  2             True            False    [2015, 3715, 2615]

到目前为止,我已经尝试将 df2/df3 分组为 'CLASSIFICATION_SYMBOL_CD'

gp = df2.groupby(['CLASSIFICATION_SYMBOL_CD'])
for x in df2['CLASSIFICATION_SYMBOL_CD'].unique():
    df2_g = gp.get_group(x)

这给了我:

Index       CLASSIFICATION_SYMBOL_CD    ART_UNIT
1354        A61N1/3714                  3762
117752      A61N1/3714                  3766
347573      A61N1/3714                  3736
548026      A61N1/3714                  3762
560771      A61N1/3714                  3762
566120      A61N1/3714                  3766
566178      A61N1/3714                  3762
799486      A61N1/3714                  3736
802408      A61N1/3714                  3736

【问题讨论】:

    标签: python-3.x pandas pandas-groupby


    【解决方案1】:

    由于df2df3 具有相同的格式,请先将它们连接起来。

    import pandas as pd
    df = pd.concat([df2, df3])
    

    然后获取所有艺术单元的列表,groupby并申请列表。

    df = df.groupby('CLASSIFICATION_SYMBOL_CD').ART_UNIT.apply(list).reset_index()
    #   CLASSIFICATION_SYMBOL_CD            ART_UNIT
    #0                 A44C27/00              [3715]
    #1                A44C27/001  [2015, 3715, 2615]
    #2                A44C27/005              [2815]
    #3                A44C27/006              [3725]
    #...
    

    最后,通过合并将此信息带到df1(您也可以使用映射或其他方式)。首先重命名列,以便在合并后清理更少。

    df = df.rename(columns={'CLASSIFICATION_SYMBOL_CD': 'SYMBOL'})
    df1 = df1.merge(df, on='SYMBOL', how='left')
    

    输出:

       Index     SYMBOL  level  not-allocatable  additional-only ART_UNIT
    0      0          A      2             True            False      NaN
    1      1        A01      4             True            False      NaN
    2      2       A01B      5             True            False      NaN
    3      3   A01B1/00      7            False            False      NaN
    4      4   A01B1/02      8            False            False      NaN
    5      5  A01B1/022      9            False            False      NaN
    6      6  A01B1/024      9            False            False      NaN
    7      7  A01B1/026      9            False            False      NaN
    

    遗憾的是,您没有在 df1 中提供任何重叠的符号,因此没有合并。但这将适用于您的完整数据。

    【讨论】:

    • 如果您不希望列表中有重复项,您可以考虑在 groupby 之后应用 set 而不是 list
    猜你喜欢
    • 2020-03-20
    • 2019-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多