Pandas中的apply与NumPy interp结合使用时,维度问题

3

我想将在动态频率集合上进行的测量插值到固定频率集合中。 我使用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类型,例如:
'f2':[4,6]

那么,没有错误并且返回了正确的答案。
非常感谢您的帮助。
1个回答

1
问题在于您试图返回一个数组,它不能被缩减。您可以返回值的列表。
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

1
太棒了!问题已经100%解决。谢谢你。 - Peter Sorensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接