在庞大数据框架上应用复杂函数

时间:2017-08-21 02:26:49

标签: python pandas numpy dataframe scipy

我有一系列线段,每个线段由唯一ID id x 以及 y 坐标标识。

DF:

   id       x       y
0   1     0.1     0.2
1   1     0.6     1.2
2   1     2.2     1.6
3   1     2.3     1.9
4   2     0.4     0.9
5   2     0.8     1.5
6   2     1.5     1.7
7   2     1.7     2.3
8   2     1.8     3.0

我想将df中每个段的采样点数增加到8个点,并将新点存储在新的df中。

在上面的df中,属于同一个id的点是一个线段,因此在上面的df中有2个ID为1和2的线段。

下面的代码显示了单个一个线段的增加采样点,比如上面df中id = 1的线段

df2 = df[df["id"]== 1]

new_x = np.linspace(df2["x"].max(), df2["x"].min(), 8)
new_y = sp.interpolate.interp1d(df2["x"], df2["y"], kind='cubic')(new_x)

但我想在上面的整个df上执行此操作,并增加每个线段的采样点。为此,我们可以通过 groupby([" id"])进行分组,然后为每个线段获取new_x和new_y,并将其存储在new_df中,其中包含列id,new_x, new_y。

预期df应具有线段ID和new_x和new_y列,如下所示

  id     new_x        new_y
0  1       2.3          1.9
1  1      1.98         1.17
2  1      1.67         0.94
3  1      1.35         1.03
4  1      1.04         1.19 
5  1      0.72         1.25
6  1      0.41         0.99
7  1      0.10         0.20
8  2      val          val
9  2      val          val
#Followed by 6 more rows for id 2 with new_x and new_y

如果有任何不清楚的地方,请告诉我。

1 个答案:

答案 0 :(得分:1)

我认为@cᴏʟᴅsᴘᴇᴇᴅ可以提供更有效的方式,但你可以试试这个。

LIST=[]
for name,df2 in df.groupby("id"):
    new_x = np.linspace(df2["x"].max(), df2["x"].min(), 8)
    new_y = interpolate.interp1d(df2["x"], df2["y"], kind='cubic')(new_x)
    New_df = pd.DataFrame({'id':name,'new_x': new_x, 'new_y': new_y})
    LIST.append(New_df)


pd.concat(LIST,axis=0).reset_index(drop=True)


Out[55]: 
    id     new_x     new_y
0    1  2.300000  1.900000
1    1  1.985714  1.170057
2    1  1.671429  0.948328
3    1  1.357143  1.027302
4    1  1.042857  1.199468
5    1  0.728571  1.257314
6    1  0.414286  0.993329
7    1  0.100000  0.200000
8    2  1.800000  3.000000
9    2  1.600000  1.905774
10   2  1.400000  1.582319
11   2  1.200000  1.498203
12   2  1.000000  1.512189
13   2  0.800000  1.500000
14   2  0.600000  1.337362
15   2  0.400000  0.900000