[英]Filling a DataFrame based on conditions for both columns and rows
我有一個 dataframe (df_1),其中包含沒有順序的坐標和值數據,如下所示:
x_grid | y_grid | n_value | |
---|---|---|---|
0 | 204.0 | 32.0 | 45 |
1個 | 204.0 | 33.0 | 32 |
2個 | 204.0 | 34.0 | 94 |
3個 | 204.0 | 35.0 | 92 |
4個 | 204.0 | 36.0 | 84 |
我想塑造成另一個 dataframe (df_2) 以便能夠創建熱圖。 所以我創建了一個空的 dataframe,其中列索引是 x_grid 值,行索引是 y_grid 值。
然后在 for 循環中,我嘗試執行一個操作,如果行索引等於 x_grid 值,然后將具有 y_grid 值索引的列更改為 n_value。
這是我的代碼:
for i, row in enumerate(df_2.iterrows()):
row_ind = index_list[i]
for j, item in enumerate(df_1.iterrows()):
x_ind = item[1].x_grid
if row_ind == x_ind:
col_ind = item[1].y_grid
row[1].col_ind = item[1].n_value
我運行這個循環我看到有新值填充 dataframe 但它似乎不正確。 第二個 dataframe 中的坐標和值與第一個不匹配。
第二個 dataframe (df_2) 部分看起來像這樣:
0 | 25 | 26 | 27 | |
---|---|---|---|---|
0 | 0 | 0 | 27 | 0 |
195 | 0 | 0 | 32 | 36 |
196 | 0 | 65 | 0 | 0 |
197 | 0 | 0 | 0 | 24 |
198 | 0 | 73 | 58 | 0 |
這是執行此操作的更好方法嗎? 我也很感激任何其他將初始 dataframe 轉換為熱圖的方法。
IIUC:
df_2 = df_1.pivot('x_grid', 'y_grid', 'n_value') \
.reindex(index=pd.RangeIndex(0, df_1['y_grid'].max()+1),
columns=pd.RangeIndex(0, df_1['x_grid'].max()+1),
fill_value=0)
如果您有相同 (x, y) 的重復值,請使用pivot_table
:
df_2 = df_1.pivot_table('n_value', 'x_grid', 'y_grid', aggfunc='mean') \
.reindex(index=pd.RangeIndex(df_1['y_grid'].min(), df_1['y_grid'].max()+1),
columns=pd.RangeIndex(df_1['x_grid'].min(), df_1['x_grid'].max()+1))
例子:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(2022)
df_1 = pd.DataFrame(np.random.randint(0, 20, (1000, 3)),
columns=['x_grid', 'y_grid', 'n_value'])
df_2 = df_1.pivot_table('n_value', 'x_grid', 'y_grid', aggfunc='mean') \
.reindex(index=pd.RangeIndex(df_1['y_grid'].min(), df_1['y_grid'].max()+1),
columns=pd.RangeIndex(df_1['x_grid'].min(), df_1['x_grid'].max()+1))
sns.heatmap(df_2, vmin=0, vmax=df_1['n_value'].max())
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.