Панды применяют функцию и обновляют копию фрейма данных

#python #pandas #dataframe #matrix #matrix-multiplication

#python #pandas #фрейм данных #матрица #умножение матрицы

Вопрос:

У меня есть фреймы данных

 df = pd.DataFrame({'A':[1,2,2,1],'B':[20,21,22,32],'C':[4,5,6,7],'D':[99,98,97,96]})
dfcopy = df.copy()
  

Я хочу применить функцию к значениям в df столбцах ‘B’ и ‘C’ на основе значения в столбце ‘A’, а затем обновить результат в соответствующих строках dfcopy .

Например, для каждой строки, где ‘A’ равно 1, получите значения ‘B’ и ‘C’ для этой строки, примените функцию и сохраните результаты в dfcopy. Для первой строки, где ‘A’ == 2, значение ‘B’ равно 21, а ‘C’ равно 5. Предположим, что функция заключается в умножении на матрицу 2×2 единиц : np.dot(np.ones((2,2)),np.array([[21],[5]])) . Затем мы хотим df[1,'B']=26 и df[1,'C']=26 . Затем я хочу повторить для другого значения, A пока функция не будет применена однозначно на основе каждого значения A .

Наконец, я не хочу перебирать строку за строкой, проверять значение A и применять функцию. Это связано с тем, что на основе каждого значения будет выполняться операция A (т. Е. np.ones((2,2)) будут заменены значениями в файле, соответствующими значению в A , и я не хочу это повторять

Я уверен, что смогу принудительно найти решение (например, путем зацикливания и установки значений), но я предполагаю, что есть элегантный способ сделать это с помощью Pandas API. Я просто не могу его найти.

Ответ №1:

В приведенном ниже примере я выбрал разные матрицы, поэтому очевидно, что я их применил.

 df = pd.DataFrame({'A':[1,2,2,1],'B':[20,21,22,32],'C':[4,5,6,7],'D':[99,98,97,96]})
matrices = [None,pd.DataFrame([[1,0],[0,0]],index=["B","C"]),pd.DataFrame([[0,0],[0,1]],index=["B","C"])]
df[["B","C"]] = pd.concat((df[df["A"] == i][["B","C"]].dot(matrices[i]) for i in set(df["A"])))
  
    A   B  C   D
0  1  20  0  99
1  2   0  5  98
2  2   0  6  97
3  1  32  0  96