我确信必须有一个非常简单的解决方案来解决这个问题,但我找不到它(浏览以前提出的问题,我没有找到我想要的答案或者没有理解它)。
我有一个类似于此的数据框(只是更大,有更多的行和列):
x val1 val2 val3
0 0.0 10.0 NaN NaN
1 0.5 10.5 NaN NaN
2 1.0 11.0 NaN NaN
3 1.5 11.5 NaN 11.60
4 2.0 12.0 NaN 12.08
5 2.5 12.5 12.2 12.56
6 3.0 13.0 19.8 13.04
7 3.5 13.5 13.3 13.52
8 4.0 14.0 19.8 14.00
9 4.5 14.5 14.4 14.48
10 5.0 15.0 19.8 14.96
11 5.5 15.5 15.5 15.44
12 6.0 16.0 19.8 15.92
13 6.5 16.5 16.6 16.40
14 7.0 17.0 19.8 18.00
15 7.5 17.5 17.7 NaN
16 8.0 18.0 19.8 NaN
17 8.5 18.5 18.8 NaN
18 9.0 19.0 19.8 NaN
19 9.5 19.5 19.9 NaN
20 10.0 20.0 19.8 NaN
在下一步中,我需要为每个值列计算导数dVal / dx(实际上我有超过3列,所以我需要在循环中有一个强大的解决方案,我可以' t每次手动选择行)。但由于某些列中的NaN值,我面临的问题是x和val的维度不同。我觉得克服这种情况的方法是只选择那些x为notnull
的x区间。但我无法做到这一点。我可能犯了一些非常愚蠢的错误(我不是程序员而且我非常没有天赋,所以请耐心等待我:))。
到目前为止,这是代码(现在我想起来了,我可能只是留下一些旧代码而引入了一些错误,因为我已经搞砸了一段时间,尝试不同的东西):
import pandas as pd
import numpy as np
df = pd.read_csv('H:/DocumentsRedir/pokus/dataframe.csv', delimiter=',')
vals = list(df.columns.values)[1:]
for i in vals:
V = np.asarray(pd.notnull(df[i]))
mask = pd.notnull(df[i])
X = np.asarray(df.loc[mask]['x'])
derivative=np.diff(V)/np.diff(X)
但是我收到了这个错误:
ValueError: operands could not be broadcast together with shapes (20,) (15,)
所以,显然,它并没有只选择notnull值......
我正在制作一个明显的错误,或者我应该采用不同的方法吗?谢谢!
(另一个不那么重要的问题:np.diff是在这里使用的正确功能还是我最好通过有限差分手动计算它?我没有找到非常有用的numpy文档。)
答案 0 :(得分:3)
计算dVal / dX:
X
我们区分所有列(第一个除外),然后将lambda函数应用于每个列,并将其除以(read)
列中的差异。