所以我用MultiIndex创建一个数据框
df = pd.DataFrame({
'C1': ['x', 'x', 'y', 'y', 'z', 'z'],
'C2': ['a', 'b', 'a', 'b', 'a', 'b'],
'C3': [10, 11, 12, 13, 14, 15]})
df.set_index(['C1', 'C2'], inplace=True)
然后我得到以下数据框
C3
C1 C2
x a 10
b 11
y a 12
b 13
z a 14
b 15
我也有一个索引为C2
的系列:
series = pd.Series([100], index=['a'])
我想将此系列分配给新列C4
,仅分配给“ x”第一个索引。如果我使用.assign
可以使用,但是会返回一个副本:
df.loc['x'].assign(C4=series)
我得到
C3 C4
C2
a 10 100.0
b 11 NaN
但是我无法将其分配给原始数据
df.loc['x'] = df.loc['x'].assign(C4=series)
收益
C3
C1 C2
x a NaN
b NaN
如果我使用这样的分配,我会得到相同的结果:
df.loc['x', 'C4'] = series
但是会产生NaN。
C3 C4
C1 C2
x a NaN NaN
b NaN NaN
y a 12.0 NaN
b 13.0 NaN
z a 14.0 NaN
b 15.0 NaN
我该如何分配?
答案 0 :(得分:4)
您可以去pd.IndexSlice
即
df.loc[pd.IndexSlice['x',series.index.tolist()],'C4'] = series.values
C3 C4
C1 C2
x a 10 100.0
b 11 NaN
y a 12 NaN
b 13 NaN
z a 14 NaN
b 15 NaN
答案 1 :(得分:1)
我想将此系列分配给新列C4,仅分配给 “ x”第一个索引。
一种方法是从索引级别映射序列。密钥方法是pd.Index.get_level_values
。然后覆盖到不需要映射的NaN
。
f['C4'] = df.index.get_level_values(1).map(series.get)
df.loc[df.index.get_level_values(0) != 'x', 'C4'] = np.nan
print(df)
C3 C4
C1 C2
x a 10 100.0
b 11 NaN
y a 12 NaN
b 13 NaN
z a 14 NaN
b 15 NaN
或者,您可以使用numpy.where
:
df['C4'] = np.where(df.index.get_level_values(0) == 'x',
df.index.get_level_values(1).map(series.get),
np.nan)