Pandas 数据帧切片左分配

时间:2021-07-13 16:26:08

标签: pandas dataframe

我想在索引不匹配的 DataFrame 切片之间对一列的值进行左分配。

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"

1 个答案:

答案 0 :(得分:1)

如果你想要左边DataFrame中缺失的索引

在将 df0.index 的值分配给 df2.index 之前,您可以通过 Index.union 后跟 reindex()df2.indexdf0 进行索引联合,如下:

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

如果您不希望左侧 DataFrame 中缺少索引

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
相关问题