代码之家  ›  专栏  ›  技术社区  ›  feetwet

数据帧片左赋值

  •  0
  • feetwet  · 技术社区  · 3 年前

    我想在索引不匹配的数据帧片之间对一列的值进行左赋值。

    df = pd.DataFrame(data=[('A', '20210101', 5.0),
                            ('B', '20210101', 3.0),
                            ('C', '20210101', 2.0),
                            ('A', '20210102', 0.0),
                            ('C', '20210102', 0.0),
                            ('A', '20210103', 0.0),
                            ('C', '20210103', 0.0),
                            ('D', '20210103', 0.0)],
                      columns=('Name', 'Date', 'Dollars')).set_index(['Name', 'Date'])
    dft = df.groupby(df.index.get_level_values('Date'))
    dates = list(dft.groups.keys())
    df0 = dft.get_group(dates[0]).reset_index(level=1)
    df1 = dft.get_group(dates[1]).reset_index(level=1)
    df2 = dft.get_group(dates[2]).reset_index(level=1)
    

    无论左切片的索引是右切片索引的子集还是超集,都有一个表达式可以工作吗?当left是子集时,以下尝试失败:

    df0.loc[df1.index, 'Dollars'] = df1.Dollars  # Works because every key in df1 is in df0 
    df0.loc[df2.index, 'Dollars'] = df2.Dollars  # KeyError: "['D'] not in index"
    
    0 回复  |  直到 3 年前
        1
  •  1
  •   feetwet    3 年前

    如果要在左侧数据框中找到缺少的索引

    您可以在上执行索引联合 df0.index df2.index 通过 Index.union 然后 reindex() 在指定 df2.1索引 df0 ,详情如下:

    df0 = df0.reindex(df0.index.union(df2.index))
    df0.loc[df2.index, 'Dollars'] = df2.Dollars  # then this run successfully
    

    print(df0)
    
              Date  Dollars
    Name                   
    A     20210101      0.0
    B     20210101      3.0
    C     20210101      0.0
    D          NaN      0.0
    

    如果您不希望左数据框中缺少索引

    commonKeys = df0.index.intersection(df2.index)
    df0.loc[commonKeys, 'Dollars'] = df2.loc[commonKeys].Dollars
    

    df0 :

              Date  Dollars
    Name                   
    A     20210101      0.0
    B     20210101      3.0
    C     20210101      0.0