从前两组中获取前两行
Get first two rows from first two groups
考虑数据框df
mux = pd.MultiIndex.from_arrays([
list('aaaabbbbbccdddddd'),
list('tuvwlmnopxyfghijk')
], names=['one', 'two'])
df = pd.DataFrame({'col': np.arange(len(mux))}, mux)
df
col
one two
a t 0
u 1
v 2
w 3
b l 4
m 5
n 6
o 7
p 8
c x 9
y 10
d f 11
g 12
h 13
i 14
j 15
k 16
如果我按索引的第一级分组,如何优雅地获取前两组的前两行:
col
one two
a t 0
u 1
b l 4
m 5
选项 1
您可以使用 list comp 和 pd.concat
:
pd.concat([g.head(2) for _, g in df.groupby(level=0)][:2])
col
one two
a t 0
u 1
b l 4
m 5
由于完成列表合成是不必要的开销,您可以使用 itertools.takewhile
来防止这种情况发生。
it = itertools.takewhile(lambda x: x[0] < 2, enumerate(df.groupby(level=0)))
pd.concat([g.head(2) for _, (_, g) in it])
col
one two
a t 0
u 1
b l 4
m 5
选项 2
我能想到的另一种可能的解决方案是预过滤你的 df 以仅保留索引级别 0 的前两个值的行,然后执行 groupby。
#
df.loc[df.index.levels[0][:2].values].groupby(level=0).head(2)
col
one two
a t 0
u 1
b l 4
m 5
看起来很老套,但这是我尝试过的
df.groupby(level=['one']).head(2)[:4]
col
one two
a t 0
u 1
b l 4
m 5
考虑数据框df
mux = pd.MultiIndex.from_arrays([
list('aaaabbbbbccdddddd'),
list('tuvwlmnopxyfghijk')
], names=['one', 'two'])
df = pd.DataFrame({'col': np.arange(len(mux))}, mux)
df
col
one two
a t 0
u 1
v 2
w 3
b l 4
m 5
n 6
o 7
p 8
c x 9
y 10
d f 11
g 12
h 13
i 14
j 15
k 16
如果我按索引的第一级分组,如何优雅地获取前两组的前两行:
col
one two
a t 0
u 1
b l 4
m 5
选项 1
您可以使用 list comp 和 pd.concat
:
pd.concat([g.head(2) for _, g in df.groupby(level=0)][:2])
col
one two
a t 0
u 1
b l 4
m 5
由于完成列表合成是不必要的开销,您可以使用 itertools.takewhile
来防止这种情况发生。
it = itertools.takewhile(lambda x: x[0] < 2, enumerate(df.groupby(level=0)))
pd.concat([g.head(2) for _, (_, g) in it])
col
one two
a t 0
u 1
b l 4
m 5
选项 2
我能想到的另一种可能的解决方案是预过滤你的 df 以仅保留索引级别 0 的前两个值的行,然后执行 groupby。
#
df.loc[df.index.levels[0][:2].values].groupby(level=0).head(2)
col
one two
a t 0
u 1
b l 4
m 5
看起来很老套,但这是我尝试过的
df.groupby(level=['one']).head(2)[:4]
col
one two
a t 0
u 1
b l 4
m 5