考虑df
idx = map('first {}'.format, range(2)) + map('last {}'.format, range(3))
df = pd.DataFrame(np.arange(25).reshape(5, -1), idx, idx)
df
我想根据行和列标题中的文本将数据框分组为四个象限。这意味着左上象限由'first'
列和'first'
行组成。右上象限由'last'
列和'first'
行组成,依此类推。
然后在每个小组中,我想
这应该有助于说明
预期输出应如下所示。
答案 0 :(得分:3)
使用嵌套的groupby-apply模式和np.roll
。对列执行groupby
,然后在索引上执行groupby
以获取要滚动的所需子组。然后使用np.roll
执行roll,将输出包装在DataFrame中,因为np.roll
只返回一个数组。
def roll_frame(df, shift):
return pd.DataFrame(np.roll(df, shift), index=df.index, columns=df.columns)
# Groupers for the index and the columns.
idx_groups = df.index.map(lambda x: x.split()[0])
col_groups = df.columns.map(lambda x: x.split()[0])
# Nested groupby, then perform the roll..
df = df.groupby(col_groups, axis=1) \
.apply(lambda grp: grp.groupby(idx_groups).apply(roll_frame, 1))
有点粗暴,但完成工作。您执行嵌套groupby
的顺序并不重要。
结果输出:
first 0 first 1 last 0 last 1 last 2
first 0 6 0 9 2 3
first 1 1 5 4 7 8
last 0 21 10 24 12 13
last 1 11 15 14 17 18
last 2 16 20 19 22 23
答案 1 :(得分:0)