[英]Replacing some dataframe values with NaN
我已經對這個問題進行了一些編輯以澄清事情。 我有一個像這樣的 dataframe:
ID (index col) 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
其中 ID 列是字符串,但 df 的 rest 是浮點數。 像這個問題一樣,我的目標是制作一個具有 3 列的新 dataframe,其中每列是原始 dataframe 的 3 列的平均值,如下所示:
ID (index) 1avg 2avg 3avg
這個問題處理了那個 grouby 調用,但在我這樣做之前,我想檢查以確保在每一行中,每個子組的至少 2/3 中都有一個實際值。 所以我需要檢查這樣的事情:
ID 1 1 1 1 1 2 2 2 2 2 3 3 3...
a 0.0005 0.0005 0.0005 0.0005 0.0005 7 5 2 19 5 18 9 20
b 0.0005 25 0.0005 0.0005 85 5 2 1 24 2 17 10 6
c 92 42 12 0.0005 15 1 2 5 52 2 3 5 7
d 25 35 11 81 12 5 6 8 2 6 23 3 5
生成數據的程序(商業)用 0.0005 替換真正缺失值的東西,無論如何用 nans 替換也很棘手。
我真正需要的是一種處理方式
1) 對於所有子組列中具有 NaN 的行(上面的行 a),什么都不會發生,但我不能刪除 NaN,因為我需要在組之間保持相同數量的行。 當我對所有 NaN 進行平均時,平均值將保持為 NaN,這是理想的。
2)對於在至少 3 列中具有 NaN 的行(上面的 b 行),我需要將 25 和 85 轉換為 NaN,這樣當我取平均值時,它將是 NaN,但該行將保留,而其他具有值的組將不受影響。
3) 對於具有 1 或 2 個 NaN 的行(上面的行 c)或在所有列中具有值的行(上面的 d 行),它們應該保持原樣以獲得平均值。
好的,我最終找到了 iterrows 的解決方案,但我仍然很想知道是否有人可以提出更好/更正確的方法。
concentrations = ['1','2','3'...]
for k in concentrations:
tf = df[k]
for index,row in tf.iterrows():
counter = 0
for item in row:
if math.isnan(item) == True:
counter = counter+1
if counter >2: #where 2 is the number of NaNs I'll let remain before I replace the row with NaNs
tf.at[index] = np.nan
#also pretty unclear if all of this is necessary but it works
tfnew = tf.groupby(by=tf.columns, axis=1).apply(lambda g: g.mean(axis=1) if isinstance(g.iloc[0,0], numbers.Number) else g.iloc[:,0])
ultra[k] = tfnew[k]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.