Python 在pandas中groupby之后将多个列转换为dict

Python 在pandas中groupby之后将多个列转换为dict,python,pandas,Python,Pandas,我有一个数据帧 df = pd.DataFrame({"a":[1,1,1,2,2,2,3,3], "b":["a","a","a","b","b","b","c","c"], "c":[0,0,1,0,1,1,0,1], "d":["x","y","z","x","y","y","z","x"]}) a b c d 0 1 a 0 x 1 1 a 0 y 2 1 a 1 z 3 2 b 0 x 4 2

我有一个数据帧

df = pd.DataFrame({"a":[1,1,1,2,2,2,3,3], "b":["a","a","a","b","b","b","c","c"], "c":[0,0,1,0,1,1,0,1], "d":["x","y","z","x","y","y","z","x"]})


    a   b   c   d
0   1   a   0   x
1   1   a   0   y
2   1   a   1   z
3   2   b   0   x
4   2   b   1   y
5   2   b   1   y
6   3   c   0   z
7   3   c   1   x
我想对a列和b列进行分组,以获得以下输出:

    a   b   e
0   1   a   [{'c': 0, 'd': 'x'}, {'c': 0, 'd': 'y'}, {'c': 1, 'd': 'z'}]
1   2   b   [{'c': 0, 'd': 'x'}, {'c': 1, 'd': 'y'}, {'c': 1, 'd': 'y'}]
2   3   c   [{'c': 0, 'd': 'z'}, {'c': 1, 'd': 'x'}]
我的解决方案:

new_df = df.groupby(["a","b"])["c","d"].apply(lambda x: x.to_dict(orient="records")).reset_index(name="e")
但问题是它的行为不一致,有时我会得到以下错误:

reset_index()获得意外的关键字参数“name”

如果有人指出上述解决方案中的问题或提供另一种方法,这将非常有用。

您可以这样做

new=ddf.groupby(['a','b'])[['c','d']].apply(lambda x : x.to_dict('r')).to_frame('e').reset_index()
Out[13]: 
   a  b                                                  e
0  1  a  [{'c': 0, 'd': 'x'}, {'c': 0, 'd': 'y'}, {'c':...
1  2  b  [{'c': 0, 'd': 'x'}, {'c': 1, 'd': 'y'}, {'c':...
2  3  c           [{'c': 0, 'd': 'z'}, {'c': 1, 'd': 'x'}]
你能行

new=ddf.groupby(['a','b'])[['c','d']].apply(lambda x : x.to_dict('r')).to_frame('e').reset_index()
Out[13]: 
   a  b                                                  e
0  1  a  [{'c': 0, 'd': 'x'}, {'c': 0, 'd': 'y'}, {'c':...
1  2  b  [{'c': 0, 'd': 'x'}, {'c': 1, 'd': 'y'}, {'c':...
2  3  c           [{'c': 0, 'd': 'z'}, {'c': 1, 'd': 'x'}]

或者,我们可以:

df['e'] = df[['c', 'd']].agg(lambda s: dict(zip(s.index, s.values)), axis=1)
df1 = df.groupby(['a', 'b'])['e'].agg(list).reset_index()


或者,我们可以:

df['e'] = df[['c', 'd']].agg(lambda s: dict(zip(s.index, s.values)), axis=1)
df1 = df.groupby(['a', 'b'])['e'].agg(list).reset_index()



你的代码对我有用。您使用的pandas版本是什么?无法复制,
pd的输出是什么?\uuuuuu version\uuuuu
?@nycoder使用pandas版本0.22,解决方案在大多数情况下都有效。即使数据相同,它也会在少数情况下抛出错误。我已经挠头好几个星期了,数据对我来说似乎还不错。我们必须看到数据哪里出了问题才能有所帮助。但是您可以看到,只有
系列.reset\u index
具有参数
name
<代码>数据帧。重置索引不可用。因此,如果列数超过
a、b、c、d
@Erfan,则可能会出错。起初我认为问题在于数据,但经过数小时的调试,我没有发现数据中有任何不一致之处。您的代码对我有效。您使用的pandas版本是什么?无法复制,
pd的输出是什么?\uuuuuu version\uuuuu
?@nycoder使用pandas版本0.22,解决方案在大多数情况下都有效。即使数据相同,它也会在少数情况下抛出错误。我已经挠头好几个星期了,数据对我来说似乎还不错。我们必须看到数据哪里出了问题才能有所帮助。但是您可以看到,只有
系列.reset\u index
具有参数
name
<代码>数据帧。重置索引不可用。因此,如果列数超过
a、b、c、d
@Erfan,则可能会出错。起初我认为问题出在数据上,但经过数小时的调试后,我没有发现数据中存在任何不一致之处。这对OP的问题有何帮助?我们不知道,因为原始解决方案也适用于测试数据集,这只是猜测。@Erfan wait for the opget a error
dataframe对象没有与_frame
相关的属性正是我所说的,您有一个
dataframe
而不是
系列
。请仔细阅读我的评论,它会解决你的问题@反社会者这究竟是如何帮助OP解决问题的?我们不知道,因为原始解决方案也适用于测试数据集,这只是猜测。@Erfan wait for the OP获取一个错误
dataframe对象不具有\u frame
的属性正是我所说的,您有一个
dataframe
而不是
Series
。请仔细阅读我的评论,它会解决你的问题@反社会者