pandas DataFrame使用列作为键的dict列表

时间:2015-11-13 16:05:09

标签: python pandas scikit-learn

我有以下数据框:

ID     Col1    Col2
1      "A"       "Z"
1      "A"       "Y"
1      "B"       "Z"
2      "A"       "X"
2      "C"       "P"

我想在下面的dict表单列表中将上面的内容转换为ID列的计数:

[{"A" : 2, "B" : 1, "Z" : 2, "Y" : 1}, {"A" : 1, "C" : 1, "X" : 1, "P" : 1}]

无论如何我能做到这一点。我所拥有的数据框非常大。

1 个答案:

答案 0 :(得分:1)

假设您的数据框名为df。您可以使用df.groupby('ID').groups获取每个ID的行号:

group_rows = df.groupby('ID').groups

我们将遍历每个组ID,然后使用Counter计算Col1Col2中的值。然后我将这些添加到字典中。

from collections import Counter

my_dict = {}
for group_id, rows in group_rows.iteritems():
    c = Counter(df.iloc[rows, 1])  # 1 = index number for `Col1`
    c.update(df.iloc[rows, 2])  # 2 = index number for `Col2`
    my_dict[group_id] = dict(c)

>>> my_dict
{1: {'A': 2, 'B': 1, 'Y': 1, 'Z': 2}, 
 2: {'A': 1, 'C': 1, 'P': 1, 'X': 1}}

我选择将结果输出到字典而不是您请求的列表,以便组ID与计数值之间的关系是显式的。如果这是一个问题,我可以假设数据框首先按ID列排序,将它们转换为列表。

keys = my_dict.keys()
keys.sort()
my_list = [my_dict[k] for k in keys]
>>> my_list
[{'A': 2, 'B': 1, 'Y': 1, 'Z': 2}, {'A': 1, 'C': 1, 'P': 1, 'X': 1}]