【问题标题】:Python - Create a new column that takes the first column from the right that is not NaN in PandasPython - 创建一个新列,该列从 Pandas 的右侧开始不是 NaN 的第一列
【发布时间】:2021-04-07 09:28:37
【问题描述】:

我有一个数据框,其名称为 'a'、'b'、'c'、'd'、'e'

#Input
import pandas as pd
import numpy as np

list_of_dicts = [
  {'a' : np.nan, 'b' : 4, 'c' : np.nan, 'd' : 5, 'e' : 2},
  {'a' : 1, 'b' : np.nan, 'c' : np.nan, 'd' : np.nan, 'e' : np.nan},
  {'a' : 7, 'b' : 5, 'c' : 0, 'd' : 5, 'e' : 3  },
  {'a' : np.nan, 'b' : 3, 'c' : np.nan, 'd' : 5, 'e' : np.nan  },
  {'a' : np.nan, 'b' : np.nan, 'c' : np.nan, 'd' : np.nan, 'e' : np.nan  }
]

df = pd.DataFrame(list_of_dicts)
#Input DataFrame
-----|-------|-------|-------|------|------|
     |  a    |  b    |  c    |  d   |  e   |
-----|-------|-------|-------|------|------|
 0   |  NaN  |  4    |  NaN  |  5   |  2   |
 1   |  1    |  NaN  |  NaN  |  NaN |  NaN |
 2   |  7    |  5    |  0    |  5   |  3   |
 3   |  NaN  |  3    |  NaN  |  5   |  NaN |
 4   |  NaN  |  NaN  |  NaN  |  NaN |  NaN |
  

我想创建一个新列 Op,它从右边开始取第一列,不是 NaN 并填充值。如果所有观测值都是 NaN,则 Op = NaN。

#Output
-----|-------|-------|-------|------|------|------|
     |  a    |  b    |  c    |  d   |  e   |  Op  |
-----|-------|-------|-------|------|------|------|
 0   |  NaN  |  4    |  NaN  |  5   |  2   |  2   |
 1   |  1    |  NaN  |  NaN  |  NaN |  NaN |  1   |
 2   |  7    |  5    |  0    |  5   |  3   |  3   |
 3   |  NaN  |  3    |  NaN  |  5   |  NaN |  5   |
 4   |  NaN  |  NaN  |  NaN  |  NaN |  NaN |  NaN |

解释:

  1. 第 0 行 - 因为 'e' 是从右侧算起的第一列,不是 NaN,所以 Op = 2
  2. 第 1 行 - 因为 'a' 是从右侧算起的第一列,不是 NaN,所以 Op = 1
  3. 第 2 行 - 因为 'e' 是从右边算起的第一列,不是 NaN,所以 Op = 3
  4. 第 3 行 - 由于 'd' 是从右侧算起的第一列,不是 NaN,所以 Op = 5
  5. 第 4 行 - 因为所有行都是 NaN,所以 Op = NaN

寻找使用 Python、Pandas 和 numpy 的解决方案。

【问题讨论】:

    标签: python pandas dataframe numpy


    【解决方案1】:

    试试ffill

    df['new'] = df.ffill(1).iloc[:,-1]
    df
    Out[59]: 
         a    b    c    d    e  new
    0  NaN  4.0  NaN  5.0  2.0  2.0
    1  1.0  NaN  NaN  NaN  NaN  1.0
    2  7.0  5.0  0.0  5.0  3.0  3.0
    3  NaN  3.0  NaN  5.0  NaN  5.0
    4  NaN  NaN  NaN  NaN  NaN  NaN
    

    【讨论】:

      【解决方案2】:

      您可以使用series.last_valid_index() 并返回值,如果没有找到值,则可以使用np.nan

      def r(row):
          last_index = row.last_valid_index()
          return row[last_index] if last_index else np.nan
      
      df['op'] = df.apply(r, axis=1)
      

      输出


           a    b    c    d    e   op
      0  NaN  4.0  NaN  5.0  2.0  2.0
      1  1.0  NaN  NaN  NaN  NaN  1.0
      2  7.0  5.0  0.0  5.0  3.0  3.0
      3  NaN  3.0  NaN  5.0  NaN  5.0
      4  NaN  NaN  NaN  NaN  NaN  NaN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        • 2023-01-28
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多