У меня есть два фрейма данных, содержащие значения с плавающей запятой.
Идея состоит в том, чтобы создать новый фрейм данных того же размера, что и второй. Он должен содержать уравнение между каждым значением 1-го фрейма данных и каждым значением для каждого столбца второго. Идея состоит в том, что он будет перебирать каждую строку для одного столбца перед переходом к следующему.
Эквация будет примерно такой df1 * df2 / len(df1)+1
Пример данных:
df1 = pd.DataFrame([10,20,30,40,50,60], columns=['POS'])
df2 = pd.DataFrame({"ID1" : [0,2,4,6,8,10] , "ID2" :[1,3,5,7,9,11]})
final = pd.DataFrame({"ID1" : [0, 5.714285714, 17.14285714, 34.28571429, 57.14285714, 85.71428571] , "ID2" :[1.428571429, 8.571428571, 21.42857143, 40, 64.28571429, 94.28571429]})
Я думаю, что вложенный цикл будет примерно таким, но я все еще не могу правильно ответить. Что мне не хватает?
final = pd.DataFrame([])
for i in list(range(0,len(df1))):
for j in list(range(0,len(df2))):
final.append(df2.iloc[i,j] * df1[0][i] / len(df1)+1)
В R ответ такой:
for (i in 1:nrow(df1)){
for (j in 1:ncol(df2)){
final[i,j] <- (df2[i,j] * df1[i,1]) / nrow(df1)+1
}
}
пропустил это, есть пример и результат
В Pandorable вы можете сделать это с помощью pandas.DataFrame.squeeze и pandas.DataFrame.mul:
result = df2.mul(df1.squeeze(), axis=0).div(len(df1)+1)
Выход :
print(result)
ID1 ID2
0 0.000000 1.428571
1 5.714286 8.571429
2 17.142857 21.428571
3 34.285714 40.000000
4 57.142857 64.285714
5 85.714286 94.285714
Это дало мне результат, но мне было интересно, есть ли способ перебрать каждое значение, потому что этот ответ хорошо работает, когда это простое умножение, но что, если вам нужно выполнить дополнительный расчет? Допустим, df1 * df2 / (len(df1) * df2)
Это не то, что говорит фрейм данных result
, которым вы поделились. Можете ли вы обновить его соответственно?
Явно для расчета df1 * df2 / (len(df1) * df2)
:
pd.DataFrame((df1.values * df2.values) / (len(df1) * df2.values), columns=df2.columns)
ID1 ID2
0 NaN 1.666667
1 3.333333 3.333333
2 5.000000 5.000000
3 6.666667 6.666667
4 8.333333 8.333333
5 10.000000 10.000000
Пожалуйста, опубликуйте некоторые образцы данных. Есть лучшие способы сделать это.