将GroupBy结果转换为列表字典

66

我有一个看起来像下面这样的Excel表格:

Column1 Column2 Column3
0       23      1
1       5       2
1       2       3
1       19      5
2       56      1
2       22      2
3       2       4
3       14      5
4       59      1
5       44      1
5       1       2
5       87      3

我希望提取这些数据,按第一列分组,并将其添加到字典中,使其呈现如下:

{0: [1],
1: [2,3,5],
2: [1,2],
3: [4,5],
4: [1],
5: [1,2,3]}

这是我目前的代码

excel = pandas.read_excel(r"e:\test_data.xlsx", sheetname='mySheet', parse_cols'A,C')
myTable = excel.groupby("Column1").groups
print myTable

然而,我的输出看起来像这样:

{0: [0L], 1: [1L, 2L, 3L], 2: [4L, 5L], 3: [6L, 7L], 4: [8L], 5: [9L, 10L, 11L]}

谢谢!


为了方便测试,我添加了示例数据框代码。数据 = { 'col1': [0,1,1,1,2,2,3,3,4,5,5,5], 'col2': np.random.randint(0, 55, 12), 'col3': [1,2,3,5,1,2,4,5,1,1,2,3] } 和 df = pd.DataFrame(data) - hyun woo Cho
2个回答

101
你可以在Column1上进行groupby,然后选择Column3并使用apply(list),最后调用to_dict
In [81]: df.groupby('Column1')['Column3'].apply(list).to_dict()
Out[81]: {0: [1], 1: [2, 3, 5], 2: [1, 2], 3: [4, 5], 4: [1], 5: [1, 2, 3]}

或者,做

In [433]: {k: list(v) for k, v in df.groupby('Column1')['Column3']}
Out[433]: {0: [1], 1: [2, 3, 5], 2: [1, 2], 3: [4, 5], 4: [1], 5: [1, 2, 3]}

23
既然@EdChum的回答与此回答完全相同并且早于此回答发布了3分钟,那么接受这个答案有点不太公平。 - LondonRob
什么是多个特征的最佳处理方式,例如:Column1是一致的键,但是在Column3的位置上,它可以有Column4、Column5等,然后合并,以便Column1仍然作为字典的键。 - Sade
2
哇,伙计,你的名字应该是英雄而不是零。 - Andrea Russett
2
如果我想将column2column3存储在字典中,同时保留它们的列名,该怎么办? - Álvaro A. Gutiérrez-Vargas

49
根据文档GroupBy.groups是一个字典,其键是计算出的唯一分组,相应的值是属于每个组的 轴标签。如果您想得到值本身,您可以按'Column1'进行 groupby 然后调用 apply 并传递 list 方法以应用于每个组。然后您可以按需转换为字典:
In [5]:

dict(df.groupby('Column1')['Column3'].apply(list))
Out[5]:
{0: [1], 1: [2, 3, 5], 2: [1, 2], 3: [4, 5], 4: [1], 5: [1, 2, 3]}

(注意:请查看此SO问题了解为什么数字后面跟着L


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接