Панды применяются с NumPy Interp, проблемы с размерами - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу интерполировать измерения, сделанные на динамических наборах частот, в фиксированный набор частот.Я использую Python 3.7 с pandas.apply и numpy.interp:

import numpy as np 
import pandas as pd

df = pd.DataFrame({'m1':[2.,3.],
               'm2':[4.,6.],
               'm3':[2.,3.],
               'shift':[1.1,1.2]})
print (df)
#     m1  m2   m3  shift
# 0  2.0   4  2.0    1.1
# 1  3.0   6  3.0    1.2

freqs =np.array([10.,20.,30.])

def myfunction(x):
  newfreqs = freqs*x[-1]
  result = np.interp(freqs,newfreqs,x[:-1])
  return result

print(df.apply(myfunction, axis=1,raw=True))

Когда я запускаю код, я получаю сообщение об ошибке:

ValueError: Shape of passed values is (3, 2), indices imply (4, 2)

Если я изменяю один из введите столбцы типа int , f.ex.

'f2':[4,6]

, затем ошибки нет, и правильный ответ возвращается.

Любая помощьоценили.

1 Ответ

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

Проблема в том, что вы пытаетесь вернуть массив, который не уменьшается.Вместо этого вы можете вернуть список значений.

def myfunction(x):
    newfreqs = freqs*x[-1]
    result = np.interp(freqs, newfreqs, x[:-1])
    return [*result]

df.apply(myfunction, axis=1, raw=True)
#0    [2.0, 3.6363636363636367, 2.5454545454545454]
#1                                  [3.0, 5.0, 4.5]
#dtype: object

Если вам нужен интерполированный DataFrame, то, возможно:

import pandas as pd

pd.DataFrame(df.apply(myfunction, axis=1 ,raw=True).tolist(),
             columns=df.columns[0:3]).add_suffix('_interp')
#   m1_interp  m2_interp  m3_interp
#0        2.0   3.636364   2.545455
#1        3.0   5.000000   4.500000
...