根据索引或列合并行

时间:2018-06-27 20:28:48

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

我有三个数据帧: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'中添加一个包含所有{{1} }来自df2和df3。

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

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

ART_UNIT

到目前为止,我已经尝试通过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)

1 个答案:

答案 0 :(得分: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中没有提供任何重叠的符号,因此没有任何合并。但这将处理您的完整数据。