【问题标题】:Remove NaN values and shift values from the next column从下一列中删除 NaN 值和移位值
【发布时间】:2020-10-19 22:23:42
【问题描述】:

我正在尝试从数据框中删除 NaN 值(不删除整个列或行)并将下一个值移动到前一列。 示例:

        CLIENT| ANIMAL_1 | ANIMAL_2 | ANIMAL_3| ANIMAL_4
ROW_1     1   |   cow    | frog     | NaN     | dog
ROW_2     2   |   pig    | NaN      | cat     | NaN

我的目标是:

       CLIENT| ANIMAL_1 | ANIMAL_2 | ANIMAL_3| ANIMAL_4
ROW_1     1   |   cow    | frog     | dog     | NaN
ROW_2     2   |   pig    | cat      | NaN     | NaN

我尝试过的:

  1. 将每一行转换为列表并从每个列表中删除 NaN。但我似乎无法从列表中删除值:

    x = df[df.CLIENT == 1].iloc[:,1:].values.tolist()

然后我得到:

[['cow', 'frog', nan, 'dog']]

删除我尝试过的“nan”:

row_without_nan = [animal for animal in x if str(animal) != 'nan']

但它不会改变列表中的任何内容。我尝试将空值更改为另一个词并使用该词,但它也不起作用。

  1. 将每一行转换为数组。我尝试使用np.array() 转换为数组,但这没用,因为空值变为'nan',当我尝试使用np.isnan 时,我得到了这个:TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

有谁知道我的清单做错了什么,或者是否有更智能/更快的方法?

【问题讨论】:

    标签: python pandas list dataframe nan


    【解决方案1】:

    这是一种方法:

    df_out = df.apply(lambda x: pd.Series(x.dropna().to_numpy()), axis=1)
    df_out = df_out.set_axis(df.columns[:df_out.shape[1]], axis=1).reindex(df.columns, axis=1)
    df_out
    

    输出:

           CLIENT ANIMAL_1 ANIMAL_2 ANIMAL_3  ANIMAL_4
    ROW_1       1      cow     frog      dog       NaN
    ROW_2       2      pig      cat      NaN       NaN
    

    详细信息,在每一行上使用 dropna,但随后您需要转换为 numpy 数组以删除索引,然后将列标题分配给原始数据帧并沿列重新索引以获取数据帧末尾的所有空列。

    【讨论】:

      【解决方案2】:

      这是另一种方法:

      def drop_nan(r):
          r = list(r)
          r = [x for x in r if isinstance(x, str) or not np.isnan(x)]
          return r
      
      res = pd.DataFrame.from_records(df.apply(drop_nan, axis=1))
      res.columns = df.columns[:len(res.columns)]
      

      结果是:

         CLIENT ANIMAL_1 ANIMAL_2 ANIMAL_3
      0       1      cow     frog      dog
      1       2      pig      cat     None
      

      【讨论】:

        【解决方案3】:

        您的方法可能没问题,但您可能遇到的问题是,从数据框中获取数组或列表后,您会得到一个嵌套列表,即。 [['牛','青蛙',南,'狗']]。注意双括号。你需要摆脱一个括号对。尝试类似 y=x[0] 的方法。然后再次运行您的 nan 删除代码。

        【讨论】:

          猜你喜欢
          • 2017-06-21
          • 2014-06-07
          • 1970-01-01
          • 2021-12-22
          • 2018-09-23
          • 2012-07-22
          • 1970-01-01
          • 2021-10-14
          相关资源
          最近更新 更多