【问题标题】:Pandas: Find first occurrences of elements that appear in a certain columnPandas:查找出现在特定列中的元素的第一次出现
【发布时间】:2018-12-16 08:12:33
【问题描述】:

假设我有以下数据框:

df_raw = pd.DataFrame({"id": [102, 102, 103, 103, 103], "val1": [9,2,4,7,6], "val2": [np.nan, 3, np.nan, 4, 5], "val3": [4, np.nan, np.nan, 5, 1], "date": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2002, 3, 3), pd.Timestamp(2003, 4, 4), pd.Timestamp(2003, 8, 9), pd.Timestamp(2005, 2, 3)]})

我想访问每个id 第一次出现的行。所以这些行将是:

df_first = pd.DataFrame({"id": [102, 103], "val1": [9, 4], "val2": [np.nan, np.nan], "val3": [4, np.nan], "date": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2003, 4, 4)]})

基本上,最后我想要实现的是填充出现在每个id 的第一次出现的NaNs。所以最终的数据框可能是:

df_processed = pd.DataFrame({"id": [102, 102, 103, 103, 103], "val1": [9,2,4,7,6], "val2": [-1, 3, -1, 4, 5], "val3": [4, np.nan, -1, 5, 1], "date": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2002, 3, 3), pd.Timestamp(2003, 4, 4), pd.Timestamp(2003, 8, 9), pd.Timestamp(2005, 2, 3)]})

重要的一点是,这些行已经按 id 和 date 分组并以升序方式排序。因此,它们与提供的示例完全相同。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC 使用 drop_duplicates 然后 concat

    df1=df_raw.drop_duplicates('id').fillna(-1)
    target=pd.concat([df1,df_raw.loc[~df_raw.index.isin(df1.index)]]).sort_index()
    target
            date   id  val1  val2  val3
    0 2002-01-01  102     9  -1.0   4.0
    1 2002-03-03  102     2   3.0   NaN
    2 2003-04-04  103     4  -1.0  -1.0
    3 2003-08-09  103     7   4.0   5.0
    4 2005-02-03  103     6   5.0   1.0
    

    【讨论】:

      【解决方案2】:

      您可以将pd.Series.duplicated 与布尔行索引一起使用:

      mask = ~df_raw['id'].duplicated()
      val_cols = ['val2', 'val3']
      
      df_raw.loc[mask, val_cols] = df_raw.loc[mask, val_cols].fillna(-1)
      
      print(df_raw)
      
          id  val1  val2  val3       date
      0  102     9  -1.0   4.0 2002-01-01
      1  102     2   3.0   NaN 2002-03-03
      2  103     4  -1.0  -1.0 2003-04-04
      3  103     7   4.0   5.0 2003-08-09
      4  103     6   5.0   1.0 2005-02-03
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-26
        • 2020-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多