Итерируйте по списку в кадре данных Pandas и суммируйте другие столбцы - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть одна сложная вещь для меня.

У меня есть df, как это:

Side_a  childs                             column1
1001     NaN                                  3
1002     ['1001']                             5
1003     ['1001']                             3
1004     ['1001,'1003']                       6 
1005     ['1001', '1002', '1003', '1004']     13
1006     ['1003', '1004']                     8

Я хочу создать новый столбец с суммой column1 для всех строк, появившихся в столбцах «childs», и собственного значения из column1.

Столбец2, скажем, должен быть:

side_a          childs                            column1  column2
1001       NaN                                      3         3
1002       ['1001']                                 5         8
1003       ['1001']                                 3         6
1004       ['1001','1003']                          6         12
1005       ['1001', '1002', '1003', '1004']         13        30
1006       ['1003', '1004']                         8         17 

Если честно, я не знал, с чего и как начать, так что любой намек так приветствуется.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

При df указанном выше входном кадре данных следующий код дает желаемый результат

df.index = [str(x) for x in df['side_a']]
df['column2'] = df['column1'] + [sum(df['column1'].loc[df['childs'][i]]) if isinstance(df['childs'][i], list) else 0 for i in range(df.shape[0])]

Это не особенно элегантно, и, конечно, есть более элегантный способ сделать это, но оно выполняет свою работу

0 голосов
/ 06 ноября 2018

Вы можете найти строки, принадлежащие потомкам, с помощью loc. Наконец, вы используете apply для агрегирования столбцов с помощью пользовательской функции, такой как:

def row_agg(row):
    column1 = row['column1']
    childs = df.loc[row['childs']]['column1'].sum() if isinstance(row['childs'],list) else 0
    return column1 + childs

df = df.set_index('Side_a')
df['column2'] = df.apply(row_agg, axis=1)

df

    childs  column1 column2
Side_a          
A   NaN         3   3
B   [A]         5   8
C   [A]         3   6
D   [A, C]      6   12
E   [A, B, C, D]13  30
F   [C, D]      8   17
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...