簡體   English   中英

用 NaN 替換一些 dataframe 值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM