Joh*_*Tam 4 python dataframe pandas
我有df1
df1 = pd.DataFrame({'x':[1,2,3,5],
'y':[2,3,4,6],
'value':[1.5,2.0,0.5,3.0]})
df1
x y value
0 1 2 1.5
1 2 3 2.0
2 3 4 0.5
3 5 6 3.0
Run Code Online (Sandbox Code Playgroud)
我想将valueatx和y坐标分配给另一个数据框df2
df2 = pd.DataFrame(0.0, index=[x for x in range(0,df1['x'].max()+1)], columns=[y for y in range(0,df1['y'].max()+1)])
df2
0 1 2 3 4 5 6
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Run Code Online (Sandbox Code Playgroud)
经过
for x, y, value in zip(df1['x'],df1['y'],df1['value']):
df2.at[x,y] = value
Run Code Online (Sandbox Code Playgroud)
给予
0 1 2 3 4 5 6
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 1.5 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 2.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.5 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5 0.0 0.0 0.0 0.0 0.0 0.0 3.0
Run Code Online (Sandbox Code Playgroud)
但是,它有点慢,因为我有很长的df1.
我们有比 更快的方法吗df.at[x,y]?
您可以避免创建零df2并使用df.at方法 by DataFrame.pivot,DataFrame.fillna和DataFrame.reindex:
df2 = (df1.pivot('x','y','value')
.fillna(0)
.reindex(index=range(df1['x'].max()+1),
columns=range(df1['y'].max()+1), fill_value=0))
print (df2)
y 0 1 2 3 4 5 6
x
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 1.5 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 2.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.5 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5 0.0 0.0 0.0 0.0 0.0 0.0 3.0
Run Code Online (Sandbox Code Playgroud)
由于您的数据都是数字,因此您可以使用 numpy; 对于更大的数据集,它可能比使用更快pd.pivot:
# create a flattened array from df2
temp = df2.to_numpy().ravel()
# get indices for a flattened array, based on df1.x and df1.y
arr = np.ravel_multi_index((df1.x, df1.y), df2.shape)
# replace at the positions with df1.value
temp[arr] = df1.value
# reshape and create dataframe
temp = temp.reshape(df2.shape)
pd.DataFrame(temp, columns = df2.columns)
0 1 2 3 4 5 6
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 1.5 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 2.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.5 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5 0.0 0.0 0.0 0.0 0.0 0.0 3.0
Run Code Online (Sandbox Code Playgroud)