Python 数据帧插值 - 向数据帧添加新行
Python dataframe interpolation - adding a new row to a dataframe
我有一个数据框,我想在 EVM = 特定值 (-30) 时添加一个新行,并使用线性插值更新其他列。
Index PwrOut EVM PwrGain Vout
0 -0.760031 -58.322902 32.239969 134.331851
1 3.242575 -58.073389 32.242575 134.332376
2 7.246203 -57.138122 32.246203 134.343538
3 11.251078 -54.160870 32.251078 134.383609
4 15.257129 -48.624869 32.257129 134.487430
5 17.260618 -45.971596 32.260618 134.586753
6 18.263079 -44.319692 32.263079 134.656616
7 19.266674 -41.532695 32.266674 134.743599
8 20.271934 -37.546253 32.271934 134.849050
9 21.278990 -33.239208 32.278990 134.972439
10 22.286989 -29.221786 32.286989 135.111068
11 23.293533 -25.652448 32.293533 135.261357
例如,(在第 3 列中)EVM = -30 位于上面第 9 行和第 10 行之间。如何包含 EVM = -30 的新行(第 9 行和第 10 行之间),然后使用基于第 9 行数字之间 EVM 列位置的线性插值更新其他列(仅在该新行中)和 10?
如果能够搜索并找到 EVM =-30 之间的行,那就太好了。
是否可以对某些行应用线性插值而对其他列应用非线性插值?
谢谢!
插值是迄今为止最简单的部分。这是一种方法。
首先,找到缺失的行并逐行添加:
targets = (-50, -40, -30) # Arbitrary
idxs = df.EVM.searchsorted(targets) # Find the rows location
arr = df.values
for idx, target in zip(idxs, targets):
arr = np.insert(arr, idx, [np.nan, target, np.nan, np.nan], axis=0)
df1 = pd.DataFrame(arr, columns=df.columns)
然后你实际上可以插值:
df2 = df1.interpolate('linear')
输出:
PwrOut EVM PwrGain Vout
0 -0.760031 -58.322902 32.239969 134.331851
1 3.242575 -58.073389 32.242575 134.332376
2 7.246203 -57.138122 32.246203 134.343538
3 11.251078 -54.160870 32.251078 134.383609
4 13.254103 -50.000000 32.254103 134.435519
5 15.257129 -48.624869 32.257129 134.487430
6 17.260618 -45.971596 32.260618 134.586753
7 18.263079 -44.319692 32.263079 134.656616
9 19.266674 -41.532695 32.266674 134.743599
8 19.769304 -40.000000 32.269304 134.796324
11 20.271934 -37.546253 32.271934 134.849050
12 21.278990 -33.239208 32.278990 134.972439
10 21.782989 -30.000000 32.282989 135.041753
13 22.286989 -29.221786 32.286989 135.111068
14 23.293533 -25.652448 32.293533 135.261357
如果您想按列自定义插值方法,请单独进行,例如:
df2.PwrOut = df1.PwrOut.interpolate('cubic')
我有一个数据框,我想在 EVM = 特定值 (-30) 时添加一个新行,并使用线性插值更新其他列。
Index PwrOut EVM PwrGain Vout
0 -0.760031 -58.322902 32.239969 134.331851
1 3.242575 -58.073389 32.242575 134.332376
2 7.246203 -57.138122 32.246203 134.343538
3 11.251078 -54.160870 32.251078 134.383609
4 15.257129 -48.624869 32.257129 134.487430
5 17.260618 -45.971596 32.260618 134.586753
6 18.263079 -44.319692 32.263079 134.656616
7 19.266674 -41.532695 32.266674 134.743599
8 20.271934 -37.546253 32.271934 134.849050
9 21.278990 -33.239208 32.278990 134.972439
10 22.286989 -29.221786 32.286989 135.111068
11 23.293533 -25.652448 32.293533 135.261357
例如,(在第 3 列中)EVM = -30 位于上面第 9 行和第 10 行之间。如何包含 EVM = -30 的新行(第 9 行和第 10 行之间),然后使用基于第 9 行数字之间 EVM 列位置的线性插值更新其他列(仅在该新行中)和 10? 如果能够搜索并找到 EVM =-30 之间的行,那就太好了。 是否可以对某些行应用线性插值而对其他列应用非线性插值?
谢谢!
插值是迄今为止最简单的部分。这是一种方法。
首先,找到缺失的行并逐行添加:
targets = (-50, -40, -30) # Arbitrary
idxs = df.EVM.searchsorted(targets) # Find the rows location
arr = df.values
for idx, target in zip(idxs, targets):
arr = np.insert(arr, idx, [np.nan, target, np.nan, np.nan], axis=0)
df1 = pd.DataFrame(arr, columns=df.columns)
然后你实际上可以插值:
df2 = df1.interpolate('linear')
输出:
PwrOut EVM PwrGain Vout
0 -0.760031 -58.322902 32.239969 134.331851
1 3.242575 -58.073389 32.242575 134.332376
2 7.246203 -57.138122 32.246203 134.343538
3 11.251078 -54.160870 32.251078 134.383609
4 13.254103 -50.000000 32.254103 134.435519
5 15.257129 -48.624869 32.257129 134.487430
6 17.260618 -45.971596 32.260618 134.586753
7 18.263079 -44.319692 32.263079 134.656616
9 19.266674 -41.532695 32.266674 134.743599
8 19.769304 -40.000000 32.269304 134.796324
11 20.271934 -37.546253 32.271934 134.849050
12 21.278990 -33.239208 32.278990 134.972439
10 21.782989 -30.000000 32.282989 135.041753
13 22.286989 -29.221786 32.286989 135.111068
14 23.293533 -25.652448 32.293533 135.261357
如果您想按列自定义插值方法,请单独进行,例如:
df2.PwrOut = df1.PwrOut.interpolate('cubic')