Как объединить столбцы в строках в кадре данных, которые удовлетворяют условию, при удалении строк - PullRequest
1 голос
/ 17 июня 2020

Я не думаю, что смогу решить эту проблему с помощью groupby() или agg(), как в этих ( Question1 , Question2 ).

У меня есть pandas.DataFrame, который имеет один столбец идентификатора (ID_Code) и несколько столбцов информации (information 1 и information 2). Мне нужно агрегировать некоторые идентификаторы. Это означает, что некоторые из них должны быть удалены, а их информация должна быть добавлена ​​в определенные c другие строки.

Чтобы проиллюстрировать мою проблему, вот что я придумал:

import pandas as pd

inp = [{'ID_Code':1,'information 1':list(x * 3 for x in range(2, 5)),'information 2':list(x / 3 for x in range(2, 5))},
       {'ID_Code':2,'information 1':list(x * 0.5 for x in range(2, 5)),'information 2':list(x / 2 for x in range(2, 5))},
       {'ID_Code':3,'information 1':list(x * 0.2 for x in range(25, 29)),'information 2':list(x / 1 for x in range(2, 5))},
       {'ID_Code':4,'information 1':list(x * 0.001 for x in range(102, 105)),'information 2':list(x / 12 for x in range(2, 5))},
       {'ID_Code':5,'information 1':list(x * 12 for x in range(15, 17)),'information 2':list(x / 24 for x in range(2, 5))},
       {'ID_Code':6,'information 1':list(x * 42 for x in range(2, 9)),'information 2':list(x / 48 for x in range(2, 5))},
       {'ID_Code':7,'information 1':list(x * 23 for x in range(1, 2)),'information 2':list(x / 96 for x in range(2, 5))},
       {'ID_Code':8,'information 1':list(x * 7.8 for x in range(8, 11)),'information 2':list(x / 124 for x in range(2, 5))}]

df = pd.DataFrame(inp)

print(df)
Out:
       ID_Code                                                    information 1   information 2
    0        1                                                       [6, 9, 12]   [0.6666666666666666, 1.0, 1.3333333333333333]
    1        2                                                  [1.0, 1.5, 2.0]   [1.0, 1.5, 2.0]
    2        3                              [5.0, 5.2, 5.4, 5.6000000000000005]   [2.0, 3.0, 4.0]
    3        4  [0.10200000000000001, 0.10300000000000001, 0.10400000000000001]   [0.16666666666666666, 0.25, 0.3333333333333333]
    4        5                                                       [180, 192]   [0.08333333333333333, 0.125, 0.16666666666666666]
    5        6                               [84, 126, 168, 210, 252, 294, 336]   [0.041666666666666664, 0.0625, 0.08333333333333333]
    6        7                                                             [23]   [0.041666666666666664, 0.0625, 0.08333333333333333]
    7        8                                               [62.4, 70.2, 78.0]   [0.016129032258064516, 0.024193548387096774, 0.03225806451612903]

Что мне нужно сделать, если я хочу избавиться от ID_Code = 1 и сохранить его информацию в ID_Code = 3, и избавьтесь от ID_Code = 5 и ID_Code = 7 и сохраните эту информацию в ID_Code = 2, чтобы DataFrame выглядел так:

   ID_Code                                                    information 1   information 2
0        2                                    [180, 192, 23, 1.0, 1.5, 2.0]   [0.08333333333333333, 0.125, 0.16666666666666666, 0.041666666666666664, 0.0625, 0.08333333333333333, 1.0, 1.5, 2.0]
1        3                    [6, 9, 12, 5.0, 5.2, 5.4, 5.6000000000000005]   [2.0, 3.0, 4.0]
2        4  [0.10200000000000001, 0.10300000000000001, 0.10400000000000001]   [0.6666666666666666, 1.0, 1.3333333333333333, 0.16666666666666666, 0.25, 0.3333333333333333]
3        6                               [84, 126, 168, 210, 252, 294, 336]   [0.041666666666666664, 0.0625, 0.08333333333333333]
4        8                                               [62.4, 70.2, 78.0]   [0.016129032258064516, 0.024193548387096774, 0.03225806451612903]

Ответы [ 2 ]

1 голос
/ 17 июня 2020

вы можете условно изменить свой df['ID_Code'], а затем суммировать столбцы.

col = 'ID_Code'
cond = [df[col].eq(1),
       df[col].isin([5,7])]

outputs = [3,2]

df[col] = np.select(cond,outputs,default=df[col])

df1 = df.groupby(col).sum()

print(df1)


                                             information 1  \
ID_Code                                                      
2                            [1.0, 1.5, 2.0, 180, 192, 23]   
3            [6, 9, 12, 5.0, 5.2, 5.4, 5.6000000000000005]   
4        [0.10200000000000001, 0.10300000000000001, 0.1...   
6                       [84, 126, 168, 210, 252, 294, 336]   
8                                       [62.4, 70.2, 78.0]   

                                             information 2  
ID_Code                                                     
2        [1.0, 1.5, 2.0, 0.08333333333333333, 0.125, 0....  
3        [0.6666666666666666, 1.0, 1.3333333333333333, ...  
4          [0.16666666666666666, 0.25, 0.3333333333333333]  
6        [0.041666666666666664, 0.0625, 0.0833333333333...  
8        [0.016129032258064516, 0.024193548387096774, 0...  
1 голос
/ 17 июня 2020

Вы можете установить ID_Code в качестве индекса и обновить с пониманием списка:

df=df.set_index('ID_Code')
df.loc[3] = [x+y for x,y in zip(df.loc[1], df.loc[3])]
df = df.drop(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...