Python 将groupby堆栈到DataFrame多索引,而不进行聚合
关于将pandas groupby对象转换为DataFrame的几个问题似乎涉及聚合,例如Python 将groupby堆栈到DataFrame多索引,而不进行聚合,python,pandas,dataframe,Python,Pandas,Dataframe,关于将pandas groupby对象转换为DataFrame的几个问题似乎涉及聚合,例如count() groupby对象是否可以在不聚合的情况下转换为数据帧,其中组名成为多索引的0级?这个过程可以迭代吗 from pandas import DataFrame as DF df = DF.from_dict({'a':1, 'b':2, 'c':3, 'd':4, 'e':5}, orient='index') 要查看分组的输出: df.groupby(lambda x: df[0][x
count()
groupby对象是否可以在不聚合的情况下转换为数据帧,其中组名成为多索引的0级?这个过程可以迭代吗
from pandas import DataFrame as DF
df = DF.from_dict({'a':1, 'b':2, 'c':3, 'd':4, 'e':5}, orient='index')
要查看分组的输出:
df.groupby(lambda x: df[0][x]%2)
转换为以下格式:
DF.from_dict({0:{'b':2,'d':4},1:{'a':1,'c':3,'e':5}},orient='index').stack().to_frame()
(除了这一点,为什么要将值转换为浮点数?使用
pd.concat
,它接受字典:
pd.concat({k: v for k, v in df.groupby(lambda x: df.loc[x, 0] % 2)})
0
0 b 2
d 4
1 a 1
c 3
e 5
迭代每个组并构建字典。词典可以使用
不涉及可调用项的稍快的解决方案可以通过
pd.concat({k: v for k, v in df.groupby(df.iloc[:,0] % 2)})
0
0 b 2
d 4
1 a 1
c 3
e 5
如果需要,请反复执行此操作,尝试一个函数
def add_level(df, grouper):
return pd.concat({k: v for k, v in df.groupby(by=grouper)})
r = add_level(df, df.iloc[:,0] % 3)
add_level(r, r.iloc[:, 0] % 2)
0
0 1 d 4
2 b 2
1 0 c 3
1 a 1
2 e 5
使用
assign
链和set\u索引
df.assign(indexlevel=np.arange(len(df))%2).\
set_index('indexlevel',append=True).\
swaplevel(0,1).\
sort_index(level=0)
Out[30]:
0
indexlevel
0 a 1
c 3
e 5
1 b 2
d 4
谢谢,这很有效。我将在Q中进一步询问,如何迭代堆栈。例如,如果'df.loc[x,0]%3'给出了0级索引[0,1,2],想将此索引进一步分组%2以获得一个3级多索引,那么合适的lambda是多少?@alancalvitti您似乎可以重复此过程两次,一次为%3,第二次为%2。但是现在
df.loc[x,0]
不起作用,因为分组是基于索引而不是值生成的。向上投票表示努力,但对于一个简单的过程来说,这还有很长的路要走。