python - 用 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 行),它们应该保持原样以获得平均值。
解决方案
好的,我最终找到了 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]
推荐阅读
- google-cloud-platform - 如何编写云函数来接收、解析和发布 PubSub 消息?
- r - 在数据框中排列染色体编号
- python - “如何修复 'NoneType' 对象不可下标”
- mysql - 为什么在查询不起作用的地方引用其他表的列?
- php - 使用@can() 添加条件后数据表列向左移动
- android - 在 Android 上异步更新 RecyclerView 中的所有项目
- wpf - 在 wpf 中隐藏 mah 应用程序地铁汉堡菜单按钮
- jquery - 在引导程序 4.1 中对行和列进行排序
- ios - iOS 11 推送通知:如何在收到推送通知后立即访问它的有效负载?
- javascript - 使用 Js 在 Laravel 刀片中的表中显示动态数据的问题