Как обновить значения в нескольких столбцах кадра данных на основе значения определенных столбцов другого кадра данных - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть 2 padas dataframe

df1 = pd.DataFrame({'id': [1001,1002,1004],
                   'col1': ["a","b","d"],
                   'col2': [1,2,6]})

df2 = pd.DataFrame({'id': [1001,1002,1003,1004,1005,1006,1007],
                    'a': [10,10,10,10,10,10,10],
                    'b': [2,2,2,2,2,2,2],
                    'c': [1,2,3,4,5,6,7],
                    'd': [5,5,5,5,5,4,5],
                    'e': [0,3,4,6,7,5,5]})

df1, а df2 имеет общий идентификатор.

всякий раз, когда значение появляется в df1.col1 (например, "a"), вычитайте значение df1.col2из соответствующего идентификатора df2 и столбца name = df1.col1 value ("a").

Вышеприведенное утверждение может сбивать с толку, но я попытаюсь объяснить на примере:

df1 id 1001 имеет col1 =a и col2 = 1

я хочу вычесть 1 из столбца a df2 для идентификатора 1001 = 10-1 = 9

в другом примере

df1 id = 1004 имеет значение col1 = d и col2 = 6, поэтому вычтите 6 из столбца d из df2, соответствующего id 1004 = 5-6 = -1. Окончательный результат будет выглядеть следующим образом

    a  b  c  d  e     id
0   9  2  1  5  0   1001
1  10  0  2  5  3   1002
2  10  2  3  5  4   1003
3  10  2  4 -1  6   1004
4  10  2  5  5  7   1005
5  10  2  6  4  5   1006
6  10  2  7  5  5   1007

Как следуетЯ решил эту проблему в Pandas эффективным способом, так как мне пришлось много раз повторять это упражнение для больших наборов данных.

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

1 Ответ

0 голосов
/ 13 декабря 2018

используйте lambda следующим образом

    df1.apply(lambda row : updateDF2(row), axis=1)

полный пример кода

import pandas as pd
df1 = pd.DataFrame({'id': [1001,1002,1004],
                   'col1': ["a","b","d"],
                   'col2': [1,2,6]})

df2 = pd.DataFrame({'id': [1001,1002,1003,1004,1005,1006,1007],
                    'a': [10,10,10,10,10,10,10],
                    'b': [2,2,2,2,2,2,2],
                    'c': [1,2,3,4,5,6,7],
                    'd': [5,5,5,5,5,4,5],
                    'e': [0,3,4,6,7,5,5]})
def updateDF2(row):
    df2.loc[df2["id"] == row["id"], row["col1"]] -= row["col2"]

#df1.apply(lambda row : updateDF2(row), axis=1)
df1.apply(updateDF2, axis=1)

print(df2)

вывод

    a  b  c  d  e    id
0   9  2  1  5  0  1001
1  10  0  2  5  3  1002
2  10  2  3  5  4  1003
3  10  2  4 -1  6  1004
4  10  2  5  5  7  1005
5  10  2  6  4  5  1006
6  10  2  7  5  5  1007
[Finished in 0.9s]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...