【问题标题】:Is there a function in pandas that look for "gaps" of some data in dataframe rows? [duplicate]pandas 中是否有一个函数可以在数据帧行中查找某些数据的“间隙”? [复制]
【发布时间】:2021-12-09 02:43:59
【问题描述】:

我在寻找我的 pandas 数据框中的空白时遇到了问题。

所以我的 df 中有这些数据:

date name score
2020-01-01 FEAT_1 0.64
2020-01-01 FEAT_2 0.17
2020-01-01 FEAT_3 0.09
2020-01-01 FEAT_4 0.07
2020-01-01 FEAT_5 0.03
2020-01-02 FEAT_1 0.90
2020-01-02 FEAT_2 0.30
2020-01-02 FEAT_3 0.20
2020-01-02 FEAT_4 0.10
2020-01-02 FEAT_6 0.02

我想做的是为错过一些FEAT_N 的日期填充行。因此,例如2020-01-01feat1,2,3,4,5 但没有feat_6,我想在其中添加具有相同datefeat_6 作为名称和score = 0 的新行。 FEAT_N 是.unique()feature_name 的值

我不知道如何处理这个问题。我的主要问题是我不知道如何查找日期列中的某个日期是否具有 FEAT_N 值。

谢谢大家。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以通过在 pandas 中使用 MultiIndex 轻松做到这一点。

    1. 将索引设置为“日期”和“名称”的MultiIndex
    2. 创建一个新的MultiIndex,它是当前MultiIndex 的笛卡尔积
    3. reindex你的数据用0填充
    df = df.set_index(["date", "name"])
    new_index = pd.MultiIndex.from_product(df.index.levels)
    new_df = df.reindex(new_index, fill_value=0)
    print(new_df)
                       score
    date       name
    2020-01-01 FEAT_1   0.64
               FEAT_2   0.17
               FEAT_3   0.09
               FEAT_4   0.07
               FEAT_5   0.03
               FEAT_6   0.00
    2020-01-02 FEAT_1   0.90
               FEAT_2   0.30
               FEAT_3   0.20
               FEAT_4   0.10
               FEAT_5   0.00
               FEAT_6   0.02
    

    以下是完全相同的方法,但旨在取悦链接上瘾者的方法:

    new_df = (
        df.set_index(["date", "name"])
        .pipe(lambda df:
            df.reindex(
                pd.MultiIndex.from_product(df.index.levels), 
                fill_value=0
            )
        )
    )
    
    print(new_df)
                       score
    date       name
    2020-01-01 FEAT_1   0.64
               FEAT_2   0.17
               FEAT_3   0.09
               FEAT_4   0.07
               FEAT_5   0.03
               FEAT_6   0.00
    2020-01-02 FEAT_1   0.90
               FEAT_2   0.30
               FEAT_3   0.20
               FEAT_4   0.10
               FEAT_5   0.00
               FEAT_6   0.02
    

    【讨论】:

      【解决方案2】:

      一种可能的方法是创建一个“网格”数据框,其中包含您想要的所有列对,将其与您的数据框外连接,然后将缺失值设置为默认值 (0):

      import pandas as pd
      
      keys1 = df['date'].unique()
      keys2 = df['name'].unique()
      # get all possible date-name pairs
      default = [[k1, k2] for k1 in keys1 for k2 in keys2]
      df_default = pd.DataFrame(default, columns=['date', 'name'])
      
      # outer merge
      df_complete = pd.merge(df, df_default, on=['date', 'name'], how='outer')
      # fill in the missing value with a reasonable default
      df_complete['score'] = df_complete['score'].fillna(0)
      

      【讨论】:

        【解决方案3】:

        如果需要这些值,我建议将它们转换为列,例如date | FEAT_1_score | FEAT_2_score

        然后,您可以使用当前数据中的分数或 0 值填充这些列。

        这是代码的粗略近似:

        import pandas as pd
        
        data = {'date':['2020-01-01','2020-01-01'], 'name':["FEAT_1", "FEAT_3"], 'score':['0.5', '0.6']}
        
        df = pd.DataFrame(data)
        
        def index_value_or_zero(x, df, feat):
            index_value = df.loc[(df["date"] == x.date) & (df["name"] == feat)]["score"]
            if len(index_value) == 0:
                return 0
            else:
                return index_value
        
        df["FEAT_1_score"] = df.apply(lambda x: index_value_or_zero(x, df, "FEAT_1"), axis=1)
        df["FEAT_2_score"] = df.apply(lambda x: index_value_or_zero(x, df, "FEAT_2"), axis=1)
        df["FEAT_3_score"] = df.apply(lambda x: index_value_or_zero(x, df, "FEAT_3"), axis=1)
        
        df = df.drop("score", axis=1).drop("name", axis=1)
        df.drop_duplicates()
        
        df
        

        返回:

            date        FEAT_1_score    FEAT_2_score    FEAT_3_score
        0   2020-01-01  0.5             0               0.6
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-22
          • 1970-01-01
          • 2015-09-08
          • 2017-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多