給定如下所示的 df,并假設列下的值lapse是唯一的,范圍從 0 到 18。但是,在此范圍內某些值不可用。在這個例子中,值0,16和18缺失。
lapse (a, i) (a, j) (b, k) c
0 2.0 0.423655 0.645894 0.437587 0.891773
1 4.0 0.963663 0.383442 0.791725 0.528895
2 6.0 0.568045 0.925597 0.071036 0.087129
3 8.0 0.020218 0.832620 0.778157 0.870012
4 10.0 0.978618 0.799159 0.461479 0.780529
5 12.0 0.118274 0.639921 0.143353 0.944669
6 14.0 0.521848 0.414662 0.264556 0.774234
目標是創建這些缺失值的代理行,并將其附加到原始df. 這樣,輸出應該如下
lapse (a, i) (a, j) (b, k) c
0 0.0 NaN NaN NaN NaN
0 2.0 0.423655 0.645894 0.437587 0.891773
1 4.0 0.963663 0.383442 0.791725 0.528895
2 6.0 0.568045 0.925597 0.071036 0.087129
3 8.0 0.020218 0.832620 0.778157 0.870012
4 10.0 0.978618 0.799159 0.461479 0.780529
5 12.0 0.118274 0.639921 0.143353 0.944669
6 14.0 0.521848 0.414662 0.264556 0.774234
1 16.0 NaN NaN NaN NaN
2 18.0 NaN NaN NaN NaN
以下代碼片段能夠回答上述目標。但是,在實際實作中,資料框的量級更大,我想知道是否有更好的方法或內置的pandas來執行此操作?
要生成到原始的行 df
import numpy as np
import pandas as pd
nshape=5
increment=2
max_val=20
np.random.seed(0)
aran=np.arange(0,max_val,increment).astype(int)
nshape=aran.shape[0]
arr=np.concatenate((aran.reshape(-1,1), np.random.random((nshape,4))), axis=1)
# Extracted only selected, other non selected index are assume case to solve
idx_available=[3, 5, 4, 2, 1, 7, 6]
df=pd.DataFrame(arr[sorted(idx_available),:],columns=['lapse',('a','i'),('a','j'),('b','k'),'c'])
建議的解決方案
name_other=[i for i in df.columns.tolist() if i!='lapse']
lapse_available=df['lapse'].to_numpy()
lapse_not_available = np.setdiff1d(aran,lapse_available)
an_array = np.empty((len(lapse_not_available),len(name_other)))
an_array[:] = np.NaN
arr2=np.concatenate((lapse_not_available.reshape(-1,1), an_array), axis=1)
df2=pd.DataFrame(arr2,columns=['lapse'] name_other)
df=pd.concat([df,df2],axis=0).sort_values(by=['lapse'])
uj5u.com熱心網友回復:
您還可以使用:
df.set_index('lapse', inplace=True)
df = df.reindex(np.arange(0,20,2)).reset_index()
OUTPUT
lapse (a, i) (a, j) (b, k) c
0 0 NaN NaN NaN NaN
1 2 0.423655 0.645894 0.437587 0.891773
2 4 0.963663 0.383442 0.791725 0.528895
3 6 0.568045 0.925597 0.071036 0.087129
4 8 0.020218 0.832620 0.778157 0.870012
5 10 0.978618 0.799159 0.461479 0.780529
6 12 0.118274 0.639921 0.143353 0.944669
7 14 0.521848 0.414662 0.264556 0.774234
8 16 NaN NaN NaN NaN
9 18 NaN NaN NaN NaN
uj5u.com熱心網友回復:
你可以merge:
df.merge(pd.DataFrame({'lapse': np.arange(0,20,2)}), how='right')
輸出:
lapse (a, i) (a, j) (b, k) c
0 0.0 NaN NaN NaN NaN
1 2.0 0.423655 0.645894 0.437587 0.891773
2 4.0 0.963663 0.383442 0.791725 0.528895
3 6.0 0.568045 0.925597 0.071036 0.087129
4 8.0 0.020218 0.832620 0.778157 0.870012
5 10.0 0.978618 0.799159 0.461479 0.780529
6 12.0 0.118274 0.639921 0.143353 0.944669
7 14.0 0.521848 0.414662 0.264556 0.774234
8 16.0 NaN NaN NaN NaN
9 18.0 NaN NaN NaN NaN
注意:merge或其他基于__eq__浮點數的操作,例如np.setdiff1d,必須小心進行。
uj5u.com熱心網友回復:
參考crono 的回答,您可以使用 pandas 中的以下工具:
Index- 要創建您的資料框將使用的完整失誤串列。索引檔案
set_index- 將您的列失效設定為索引以促進資料框轉換。設定索引檔案
reindex- 主要部分,要將您的資料框與完整串列 o lapses 合并,reindex 將自動用 NaN 填充缺失的行并保留已經存在的行。重新索引檔案
reset_index- 將您的失誤回傳到普通列而不是索引。重置索引檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/383060.html
上一篇:大熊貓樣本相對于群體規模
