首页 > 解决方案 > 用 NaN 替换一些数据框值

问题描述

我已经对这个问题进行了一些编辑以澄清事情。我有一个这样的数据框:

ID (index col)   1   1   1   1   1   2   2   2   2   2   3   3   3   3   3

其中 ID 列是字符串,但 df 的其余部分是浮点数。像这个问题一样,我的目标是制作一个包含 3 列的新数据框,其中每列是原始数据框中 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 行),它们应该保持原样以获得平均值。

标签: pythonpandasdataframe

解决方案


好的,我最终找到了 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]

推荐阅读