Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:将DataFrameGroupBy对象转换为所需格式_Python_Group By_Pandas_Dataframe - Fatal编程技术网

Python 熊猫:将DataFrameGroupBy对象转换为所需格式

Python 熊猫:将DataFrameGroupBy对象转换为所需格式,python,group-by,pandas,dataframe,Python,Group By,Pandas,Dataframe,我有一个数据框,如下所示: import pandas as pd import numpy as np df = pd.DataFrame({'id' : range(1,9), 'code' : ['one', 'one', 'two', 'three', 'two', 'three', 'one', 'two'], 'colour': ['black', '

我有一个数据框,如下所示:

import pandas as pd
import numpy as np
df = pd.DataFrame({'id' : range(1,9),
                   'code' : ['one', 'one', 'two', 'three',
                             'two', 'three', 'one', 'two'],
                   'colour': ['black', 'white','white','white',
                           'black', 'black', 'white', 'white'],
                   'amount' : np.random.randn(8)},  columns= ['id','code','colour','amount'])
我希望能够将
id
code
color
进行分组,然后根据
amount
对其进行排序
groupby()

但是,我希望的输出如下所示,其中我有两列:1.
code/color
包含键字符串,2.
id:amount
包含
id
-
amount
按降序排序的元组wrt
amount

code/colour  id:amount
one/black    {1:-0.117307}
one/white    {2:1.653216, 7:0.817205}
three/black  {6:0.567162}
three/white  {4:0.579074}
two/black    {5:-1.683988}
two/white    {3:-0.457722, 8:-1.277020}
如何将上面显示的
DataFrameGroupBy
对象转换为所需格式?或者,我应该首先不使用
groupby()

编辑: 虽然不是指定的格式,但下面的代码提供了我想要的功能:

groups = dict(list(df.groupby(['code','colour'])))
groups['one','white']
   id code colour    amount
1   2  one  white  1.331766
6   7  one  white  0.808739
如何将组减少到只包含
id
amount
列?

下面是一种“丑陋”的方法。首先要做的事情-您想要的输出在Pandas中不会发挥得很好,因为
dict
是不可损坏的;所以你可能会失去真正的利益

od = OrderedDict()
for name, group in df.groupby(['code', 'colour']):
    # Convert the group to a dict
    temp = group[['id', 'amount']].sort(['amount'], ascending=[0]).to_dict()
    # Extract id:amount
    temp2 = {temp['id'][key]: temp['amount'][key] for key in temp['amount'].iterkeys()}
    od["%s/%s" % (name)] = temp2

这只是一个开始!不完全是您想要的。

首先,按代码和颜色分组,然后应用自定义功能格式化id和金额:

df = df.groupby(['code', 'colour']).apply(lambda x:x.set_index('id').to_dict('dict')['amount'])
然后修改索引:

df.index = ['/'.join(i) for i in df.index]
它将返回一个系列,您可以通过以下方式将其转换回数据帧:

df = df.reset_index()
最后,通过以下方式添加列名:

df.columns=['code/colour','id:amount']
结果:

In [105]: df
Out[105]: 
   code/colour                               id:amount
0    one/black                     {1: 0.392264412544}
1    one/white  {2: 2.13950686015, 7: -0.393002947047}
2  three/black                      {6: -2.0766612539}
3  three/white                     {4: -1.18058561325}
4    two/black                     {5: -1.51959565941}
5    two/white  {8: -1.7659863039, 3: -0.595666853895}

谢谢,这似乎很有用。我在网站上搜索,发现了另一个解决方案,它使用
dict(list(df.groupby(['code','color']))
提供了类似的功能(尽管不是指定的确切格式)。唯一不受欢迎的是,这不必要地存储了所有列。是否有办法使此存储仅包含
id
amount
列?我在EDITWhat功能下的问题中添加了这一点,你做了什么?字典将代码、颜色对映射到包含id和金额的数据框?
In [105]: df
Out[105]: 
   code/colour                               id:amount
0    one/black                     {1: 0.392264412544}
1    one/white  {2: 2.13950686015, 7: -0.393002947047}
2  three/black                      {6: -2.0766612539}
3  three/white                     {4: -1.18058561325}
4    two/black                     {5: -1.51959565941}
5    two/white  {8: -1.7659863039, 3: -0.595666853895}