pandas DataFrame 中行之间的线性插值
Linear interpolation between rows in pandas DataFrame
我有以下数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame([np.zeros(10),
np.arange(1,11),
np.arange(11,21),
np.arange(21,31)])
我正在寻找一种在行之间进行高效线性插值的方法。例如,我想使用线性插值在 DataFrame 的每一行之间添加 n 新行。该方法需要尽可能高效,因为我使用的实际数据帧非常大。预期的输出是一个 DataFrame,每个现有行之间有 n 个新行。
IIUC,如果您的索引是默认范围索引,您可以使用 reindex
和 np.linspace
,否则您可以 reset_index
使用此方法。
df = pd.DataFrame([np.zeros(10),
np.arange(1,11),
np.arange(11,21),
np.arange(21,31)])
n=5
new_indx = np.linspace(df.index.min(), df.index.max(), (df.shape[0]-1)*n+df.shape[0])
df.reindex(new_indx).interpolate(method='index')
输出:
0 1 2 3 4 5 \
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.166667 0.166667 0.333333 0.500000 0.666667 0.833333 1.000000
0.333333 0.333333 0.666667 1.000000 1.333333 1.666667 2.000000
0.500000 0.500000 1.000000 1.500000 2.000000 2.500000 3.000000
0.666667 0.666667 1.333333 2.000000 2.666667 3.333333 4.000000
0.833333 0.833333 1.666667 2.500000 3.333333 4.166667 5.000000
1.000000 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000
1.166667 2.666667 3.666667 4.666667 5.666667 6.666667 7.666667
1.333333 4.333333 5.333333 6.333333 7.333333 8.333333 9.333333
1.500000 6.000000 7.000000 8.000000 9.000000 10.000000 11.000000
1.666667 7.666667 8.666667 9.666667 10.666667 11.666667 12.666667
1.833333 9.333333 10.333333 11.333333 12.333333 13.333333 14.333333
2.000000 11.000000 12.000000 13.000000 14.000000 15.000000 16.000000
2.166667 12.666667 13.666667 14.666667 15.666667 16.666667 17.666667
2.333333 14.333333 15.333333 16.333333 17.333333 18.333333 19.333333
2.500000 16.000000 17.000000 18.000000 19.000000 20.000000 21.000000
2.666667 17.666667 18.666667 19.666667 20.666667 21.666667 22.666667
2.833333 19.333333 20.333333 21.333333 22.333333 23.333333 24.333333
3.000000 21.000000 22.000000 23.000000 24.000000 25.000000 26.000000
6 7 8 9
0.000000 0.000000 0.000000 0.000000 0.000000
0.166667 1.166667 1.333333 1.500000 1.666667
0.333333 2.333333 2.666667 3.000000 3.333333
0.500000 3.500000 4.000000 4.500000 5.000000
0.666667 4.666667 5.333333 6.000000 6.666667
0.833333 5.833333 6.666667 7.500000 8.333333
1.000000 7.000000 8.000000 9.000000 10.000000
1.166667 8.666667 9.666667 10.666667 11.666667
1.333333 10.333333 11.333333 12.333333 13.333333
1.500000 12.000000 13.000000 14.000000 15.000000
1.666667 13.666667 14.666667 15.666667 16.666667
1.833333 15.333333 16.333333 17.333333 18.333333
2.000000 17.000000 18.000000 19.000000 20.000000
2.166667 18.666667 19.666667 20.666667 21.666667
2.333333 20.333333 21.333333 22.333333 23.333333
2.500000 22.000000 23.000000 24.000000 25.000000
2.666667 23.666667 24.666667 25.666667 26.666667
2.833333 25.333333 26.333333 27.333333 28.333333
3.000000 27.000000 28.000000 29.000000 30.000000
我有以下数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame([np.zeros(10),
np.arange(1,11),
np.arange(11,21),
np.arange(21,31)])
我正在寻找一种在行之间进行高效线性插值的方法。例如,我想使用线性插值在 DataFrame 的每一行之间添加 n 新行。该方法需要尽可能高效,因为我使用的实际数据帧非常大。预期的输出是一个 DataFrame,每个现有行之间有 n 个新行。
IIUC,如果您的索引是默认范围索引,您可以使用 reindex
和 np.linspace
,否则您可以 reset_index
使用此方法。
df = pd.DataFrame([np.zeros(10),
np.arange(1,11),
np.arange(11,21),
np.arange(21,31)])
n=5
new_indx = np.linspace(df.index.min(), df.index.max(), (df.shape[0]-1)*n+df.shape[0])
df.reindex(new_indx).interpolate(method='index')
输出:
0 1 2 3 4 5 \
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
0.166667 0.166667 0.333333 0.500000 0.666667 0.833333 1.000000
0.333333 0.333333 0.666667 1.000000 1.333333 1.666667 2.000000
0.500000 0.500000 1.000000 1.500000 2.000000 2.500000 3.000000
0.666667 0.666667 1.333333 2.000000 2.666667 3.333333 4.000000
0.833333 0.833333 1.666667 2.500000 3.333333 4.166667 5.000000
1.000000 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000
1.166667 2.666667 3.666667 4.666667 5.666667 6.666667 7.666667
1.333333 4.333333 5.333333 6.333333 7.333333 8.333333 9.333333
1.500000 6.000000 7.000000 8.000000 9.000000 10.000000 11.000000
1.666667 7.666667 8.666667 9.666667 10.666667 11.666667 12.666667
1.833333 9.333333 10.333333 11.333333 12.333333 13.333333 14.333333
2.000000 11.000000 12.000000 13.000000 14.000000 15.000000 16.000000
2.166667 12.666667 13.666667 14.666667 15.666667 16.666667 17.666667
2.333333 14.333333 15.333333 16.333333 17.333333 18.333333 19.333333
2.500000 16.000000 17.000000 18.000000 19.000000 20.000000 21.000000
2.666667 17.666667 18.666667 19.666667 20.666667 21.666667 22.666667
2.833333 19.333333 20.333333 21.333333 22.333333 23.333333 24.333333
3.000000 21.000000 22.000000 23.000000 24.000000 25.000000 26.000000
6 7 8 9
0.000000 0.000000 0.000000 0.000000 0.000000
0.166667 1.166667 1.333333 1.500000 1.666667
0.333333 2.333333 2.666667 3.000000 3.333333
0.500000 3.500000 4.000000 4.500000 5.000000
0.666667 4.666667 5.333333 6.000000 6.666667
0.833333 5.833333 6.666667 7.500000 8.333333
1.000000 7.000000 8.000000 9.000000 10.000000
1.166667 8.666667 9.666667 10.666667 11.666667
1.333333 10.333333 11.333333 12.333333 13.333333
1.500000 12.000000 13.000000 14.000000 15.000000
1.666667 13.666667 14.666667 15.666667 16.666667
1.833333 15.333333 16.333333 17.333333 18.333333
2.000000 17.000000 18.000000 19.000000 20.000000
2.166667 18.666667 19.666667 20.666667 21.666667
2.333333 20.333333 21.333333 22.333333 23.333333
2.500000 22.000000 23.000000 24.000000 25.000000
2.666667 23.666667 24.666667 25.666667 26.666667
2.833333 25.333333 26.333333 27.333333 28.333333
3.000000 27.000000 28.000000 29.000000 30.000000