我有一个包含许多行和列的大型多索引数据框。我想在第一级数据框中添加一列,同时保留第二级结构。我的第一个目标是了解如何向该数据框添加新的空白列。我的第二个目标是了解如何使用计算填充新列,在本例中是第一列字段和第二列字段之间的简单减法。
原始数据框:
data = [[99,3,12,4,63,55]]
cols = pd.MultiIndex.from_product([['1. FY21','2. FY22','3. FY23'],['Values','Sites']])
df = pd.DataFrame(data, columns = cols)
df.columns.set_levels(['1. FY21','2. FY22','3. FY23'],level=0,inplace=True)
df.columns.set_levels(['Values', 'Sites'], level=1, inplace=True)
所需输出 #1 - 仅添加一个空的新列
data_new = [[99,3,12,4,63,55,"blank","blank"]]
cols_new = pd.MultiIndex.from_product([['1. FY21','2. FY22','3. FY23','4. New Column'],['Values','Sites']])
df_new = pd.DataFrame(data_new, columns = cols_new)
所需输出 #2 - 在新列中进行计算
data_newer = [[99,3,12,4,63,55,87,-1]]
cols_new = pd.MultiIndex.from_product([['1. FY21','2. FY22','3. FY23','4. New Column'],['Values','Sites']])
df_newer = pd.DataFrame(data_newer, columns = cols_new)
您可以从级别 1 和
join
获取到原始 DataFrame 的唯一值,以创建具有相同结构的新列。然后使用at
来赋值:
df = df.join(pd.DataFrame(columns=pd.MultiIndex.from_product([["4. New Column"], df.columns.get_level_values(1).unique()])))
df.at[0, ("4. New Column","Values")] = 87
df.at[0, ("4. New Column","Sites")] = -1
>>> df
1. FY21 2. FY22 3. FY23 4. New Column
Sites Values Sites Values Sites Values Sites Values
0 99 3 12 4 63 55 -1 87