迭代填充空熊猫

Posted

技术标签:

【中文标题】迭代填充空熊猫【英文标题】:Iterate to fill nulls pandas 【发布时间】:2021-12-29 14:29:30 【问题描述】:

我有一个表,我想在其中填充一些空值作为列之间的条件规则。一张桌子看起来像这样:

Master ID_A Col_A Col_B Col_C
X 1 a NaN NaN
X 2 g f o
X 3 t s o
Y 4 a d c
Y 5 e r Nan

我的想法是:

在每一行中,查找空值。 当我找到一个空值时,寻找具有相同主数据的另一行并用该行的 ID_A 填充空值 在这种情况下,Col_B 为 2,Col_C 为 3(第一行) 第五行的 Col_C 将是 4

我该怎么做?我仍然觉得很难构建循环,但我想了解更多!谢谢

【问题讨论】:

为什么第一行是 2 然后 3?你需要遍历ID_A吗?如果特定行的nans 比ID_A 多怎么办?从 2 点重启? 【参考方案1】:

这比我想象的要难!这是一种蛮力的方法:

import pandas as pd
import numpy as np

df = pd.DataFrame('Master': ['X','X','X','Y','Y'],
               'ID_A': range(1,6),
               'Col_A': ['a','g','t','a','e'],
               'Col_B': [np.nan,'f','s','d','r'],
               'Col_C': [np.nan,'o','o','c',np.nan])

master_vals = df['Master'].unique()

for val in master_vals:
  df_master = df[df['Master'] == val]
  for row in df_master.index:
    counter = 0
    for col in ['Col_A','Col_B','Col_C']:
      if pd.isnull(df_master.loc[row,col]):
        full_df = df_master.dropna()
        index = full_df.index
        df.loc[row,col] = full_df.loc[index[0]+counter,'ID_A']
        counter += 1

对于我们的每个主值[X,Y],我们只选择数据框中的那些行到df_master。然后从df_master遍历我们关心的行和列,寻找NaN。如果我们找到一个,那么我们搜索full_dfdf_master 中不包含任何 NaN 的部分),并使用计数器选择和适当的值来帮助索引。这给我们留下了:

df
    Master  ID_A    Col_A   Col_B   Col_C
0   X       1       a       2       3
1   X       2       g       f       o
2   X       3       t       s       o
3   Y       4   a   d   c
4   Y       5   e   r   4

如果您的数据集很大,这种方法可能会非常慢,并且还可能产生意外行为,除非您的数据的结构与给出的示例完全相同。使用groupbystack 可能会更好地完成整个任务,但我无法让它们工作。

【讨论】:

以上是关于迭代填充空熊猫的主要内容,如果未能解决你的问题,请参考以下文章

熊猫通过该类别的平均值填充空值(使用循环?)

如何在熊猫中用空列表[]填充数据框Nan值?

熊猫从以前的日期开始填充连续的空日期值+固定天数

如何在熊猫中为每个组做前向填充

用熊猫插值时如何控制X和Y

迭代熊猫数据框