Bri*_*ian 15 python group-by dataframe pandas pandas-groupby
我有一个数据帧 df
df = pd.DataFrame(np.arange(20).reshape(10, -1),
[['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd'],
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']],
['X', 'Y'])
Run Code Online (Sandbox Code Playgroud)
如何获取按索引第一级分组的第一行和最后一行?
我试过了
df.groupby(level=0).agg(['first', 'last']).stack()
Run Code Online (Sandbox Code Playgroud)
得到了
X Y
a first 0 1
last 6 7
b first 8 9
last 12 13
c first 14 15
last 16 17
d first 18 19
last 18 19
Run Code Online (Sandbox Code Playgroud)
这非常接近我想要的.如何保留1级索引并改为:
X Y
a a 0 1
d 6 7
b e 8 9
g 12 13
c h 14 15
i 16 17
d j 18 19
j 18 19
Run Code Online (Sandbox Code Playgroud)
piR*_*red 18
def first_last(df):
return df.ix[[0, -1]]
df.groupby(level=0, group_keys=False).apply(first_last)
Run Code Online (Sandbox Code Playgroud)
idx = df.index.to_series().groupby(level=0).agg(['first', 'last']).stack()
df.loc[idx]
Run Code Online (Sandbox Code Playgroud)
我也滥用了这个agg功能.下面的代码有效,但更加丑陋.
df.reset_index(1).groupby(level=0).agg(['first', 'last']).stack() \
.set_index('level_1', append=True).reset_index(1, drop=True) \
.rename_axis([None, None])
Run Code Online (Sandbox Code Playgroud)
每个@unutbu:agg(['first', 'last'])取第一个非na值.
我将其解释为,必须按列运行此列.此外,强制索引级别= 1对齐可能甚至没有意义.
我们来包括另一个测试
df = pd.DataFrame(np.arange(20).reshape(10, -1),
[list('aaaabbbccd'),
list('abcdefghij')],
list('XY'))
df.loc[tuple('aa'), 'X'] = np.nan
Run Code Online (Sandbox Code Playgroud)
def first_last(df):
return df.ix[[0, -1]]
df.groupby(level=0, group_keys=False).apply(first_last)
Run Code Online (Sandbox Code Playgroud)
df.reset_index(1).groupby(level=0).agg(['first', 'last']).stack() \
.set_index('level_1', append=True).reset_index(1, drop=True) \
.rename_axis([None, None])
Run Code Online (Sandbox Code Playgroud)
果然!第二个解决方案是获取第X列中的第一个有效值.现在,强制该值与索引a对齐是没有意义的.
这可能是简单的解决方案。
df.groupby(level = 0, as_index= False).nth([0,-1])
X Y
a a 0 1
d 6 7
b e 8 9
g 12 13
c h 14 15
i 16 17
d j 18 19
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。(是)
| 归档时间: |
|
| 查看次数: |
11220 次 |
| 最近记录: |