我有一系列线段,每个线段由唯一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
如果有任何不清楚的地方,请告诉我。
答案 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