Pandas, умножьте часть одного DF против другого на основе условия - PullRequest
0 голосов
/ 10 января 2020

Довольно плохо знаком с этим, и у меня возникают проблемы с поиском правильного способа сделать это.

Скажем, у меня есть dataframe1, похожий на это с именами столбцов и набором чисел в качестве данных:

 D  L  W  S

 1  2  3  4

 4  3  2  1

 1  2  3  4

и у меня dataframe2 выглядит следующим образом:

Name1  Name2  Name3  Name4

2     data    data    D

3     data    data    S

4     data    data    L

5     data    data    S

6     data    data    W

Я бы хотел, чтобы новый кадр данных был создан с результатом умножения каждой строки второго кадра данных на каждую строку первого кадра данных, где он умножает значение Name1 против значения в столбце dataframe1, которое соответствует значению Name4 из dataframe2.

Есть ли какой-нибудь хороший способ сделать это? Я пытался использовать такие методы, как where, condition и apply, но не достаточно хорошо разбирался в вещах, чтобы что-то заработало.

РЕДАКТИРОВАТЬ: Используйте следующий код для создания фальшивых данные для фреймов данных:

d1 = {'D':[1,2,3,4,5,6],'W':[2,2,2,2,2,2],'L':[6,5,4,3,2,1],'S':[1,2,3,4,5,6]}

d2 = {'col1': [3,2,7,4,5,6], 'col2':[2,2,2,2,3,4], 'col3':['data', 'data', 'data','data', 'data', 'data' ], 'col4':['D','L','D','W','S','S']}

df1 = pd.DataFrame(data = d1)

df2 = pd.DataFrame(data = d2)

ИЗМЕНИТЬ СНОВА ДЛЯ БОЛЬШЕ ИНФОРМАЦИИ

Сначала я изменил данные в df1 на этом этапе, чтобы этот новый пример получился лучше. Итак, из этих двух фреймов данных фрейм данных, который я хотел бы создать, получился бы так, если бы умножение закончилось для первых четырех строк df2. Вы можете видеть, что Col2 и Col3 не изменились, но в зависимости от буквы Col4, Col1 умножили на соответствующий коэффициент из df1:

d3 = {'col1': [3,6,9,12, 15,18,12,10,8,6,4,2,7,14,21,28,35,42,8,8,8,8,8,8], «col2»: [2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], 'col3': [ «данные», «данные», «данные», «данные», «данные», «данные», «данные», «данные», «данные», «данные», «данные», «данные», "данные «,» данные »,« данные »,« данные »,« данные »,« данные »,« данные »,« данные »,« данные »,« данные »,« данные »,« данные »],« col4 » : [ 'D', 'D', 'D', 'D' 'D' 'D' 'L' 'L' 'L' 'L' 'L' 'L', 'D', 'D', 'D', 'D', 'D', 'D', 'W', 'W', 'W', 'W', 'W', 'W']}

df3 = pd.DataFrame (data = d3)

1 Ответ

0 голосов
/ 10 января 2020

Мне кажется, я понимаю, чего вы пытаетесь достичь. Вы хотите умножить каждую строку r в df2 на соответствующий столбец c в df1, но элементы из c умножаются только на первый элемент в r, остальная часть строки не изменить.

Я думал, что может быть способ присоединиться к df1.transpose() и df2, но я не нашел его. Хотя код выглядит не очень красиво, я думаю, что код ниже решает вашу проблему:

def stretch(row): 
    repeated_rows = pd.concat([row]*len(df1), axis=1, ignore_index=True).transpose() 
    factor = row['col1'] 
    label  = row['col4'] 
    first_column = df1[label] * factor 
    repeated_rows['col1'] = first_column 
    return repeated_rows                                                                                                                                  


pd.concat((stretch(r) for _, r in df2.iterrows()), ignore_index=True)                                                                                                        
#resulting in

   col1 col2  col3 col4
0     3    2  data    D
1     6    2  data    D
2     9    2  data    D
3    12    2  data    D
4    15    2  data    D
5    18    2  data    D
0    12    2  data    L
1    10    2  data    L
2     8    2  data    L
3     6    2  data    L
4     4    2  data    L
5     2    2  data    L
0     7    2  data    D
1    14    2  data    D
2    21    2  data    D
3    28    2  data    D
4    35    2  data    D
5    42    2  data    D
0     8    2  data    W
1     8    2  data    W
2     8    2  data    W
3     8    2  data    W
4     8    2  data    W
5     8    2  data    W
...
...