Как использовать функцию apply / custom для двух связанных фреймов данных с условиями, наложенными на столбцы - PullRequest
1 голос
/ 17 февраля 2020

У меня есть два кадра данных df1 и df2, которые выглядят следующим образом:


df1

    A   B   C
0   Y1  X1  1000
1   Y2  X2  3000
2   Y3  X1  2000
3   Y4  X1  5000
4   Y5  X3  7000
5   Y6  X4  1500
6   Y7  X2  1200
7   Y8  X4  1100
df2

      K    L   M   N
0   Y1  X1  40  2020-06
1   Y1  X1  30  2020-05
2   Y2  X2  50  2020-01
3   Y1  X1  90  2020-04
4   Y3  X1  10  2020-06
5   Y2  X2  40  2020-04
6   Y3  X1  55  2020-03
7   Y4  X1  12  2019
8   Y5  X3  80  2020-04
9   Y5  X3  60  2020-05
10  Y6  X4  90  2020-06
11  Y7  X2  30  2020-03
12  Y8  X4  50  2020-02
13  Y7  X2  60  2020-01

Что мне нужно из двух вышеупомянутых фреймов данных, так это то, что я хочу добавить новый столбец в df1, наложив условие на столбец N второго фрейма данных, т.е. добавьте строки того же типа, значение которых равно <= 2020-05 (формат строки год-неделя). Я хочу получить желаемый результат: </p>

df3 = pd.DataFrame({"A":["Y1","Y2","Y3","Y4","Y5","Y7","Y8"],
                    "B":["X1","X2","X1","X1","X3","X2","X4"],
                    "C":[1000,3000,2000,5000,7000,1200,1100],
                    "P":[30+90,50+40,55,12,80+60,30+60,50]})

df3

     A  B     C     P
0   Y1  X1  1000    120
1   Y2  X2  3000    90
2   Y3  X1  2000    55
3   Y4  X1  5000    12
4   Y5  X3  7000    140
5   Y7  X2  1200    90
6   Y8  X4  1100    50

То есть по наложенному условию я добавляю строки, которые удовлетворяют условиям df2 (кроме столбца N), а затем, наконец, добавляю столбец P к df1.

Для простоты я взял пример, фактический набор данных большой. Может ли кто-нибудь помочь мне написать функцию для получения желаемого результата, или как я могу использовать функцию apply или iterrows et c. Я новичок в программировании, и я застрял. Помощь оценена.

1 Ответ

0 голосов
/ 17 февраля 2020

Вы можете сначала отфильтровать строки, которые не соответствуют вашим условиям в столбце N, а затем сгруппировать и суммировать в столбце M, чтобы получить значения для столбца P:

df_tmp = df2.query("N < 13").groupby([K, L])["M"].sum()
df3 = df1.join(df_tmp, how="left").fillna(0)
...