如何从 Pandas 数据框创建多值字典

6
假设我有一个带有两列的pandas数据框(column A和Column B): 对于'A'列中的值,在'B'列中有多个值。 我想创建一个字典,每个键(key)都有多个值,这些值也应该是唯一的。请为我提供一种实现方法。
2个回答

8

一种方法是按列A分组:

In [1]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B'])

In [2]: df
Out[2]:
   A  B
0  1  2
1  1  4
2  5  6

In [3]: g = df.groupby('A')

对于该组的每个B列应用tolist:

In [4]: g['B'].tolist()  # shorthand for .apply(lambda s: s.tolist()) "automatic delegation"
Out[4]:
A
1    [2, 4]
5       [6]
dtype: object

然后在这个系列上调用to_dict

In [5]: g['B'].tolist().to_dict()
Out[5]: {1: [2, 4], 5: [6]}

如果您想使它们唯一,请使用 unique (注意:这将创建一个 numpy 数组而不是列表):

In [11]: df = pd.DataFrame([[1, 2], [1, 2], [5, 6]], columns=['A', 'B'])

In [12]: g = df.groupby('A')

In [13]: g['B'].unique()
Out[13]:
A
1    [2]
5    [6]
dtype: object

In [14]: g['B'].unique().to_dict()
Out[14]: {1: array([2]), 5: array([6])}

其他的选择是使用.apply(lambda s: set(s)).apply(lambda s: list(set(s))).apply(lambda s: list(s.unique()))等方式...


@DSM 我认为实际上是在 groupby 中应用了 Series.tolist(相当神奇)...您可以使用许多 Series/DataFrame 方法对 groupby 进行操作(我认为这只是 .apply(lambda s: s.tolist()) 的简写)。 - Andy Hayden
啊,原来是自动委托让我感到困惑了。 - DSM
我找到了一个解决方案,但它没有附加唯一值。请建议一种附加唯一值的方法。 df = dataframe[['A','B']] for i in range(len(df['A'])): if df.loc[i][0] in dict.keys(): dict[df.loc[i][0]].append(df.loc[i][1]) else: dict[df.loc[i][0]]=[df.loc[i][1]] - Akshay
你对我在之前评论中发布的解决方案有什么看法?我还发现了一种使它独特的方法。只需在if条件语句下再添加一个if条件语句,如:如果df.loc[i][1]不在dict[df.loc[i][0]]中: - Akshay
@Akshay 如果你想以那种方式做,你也可以使用defaultdict(list)或defaultdict(set),避免if/else :) - Andy Hayden

3
你可以实际上循环 df.groupby 对象并将值收集为列表。
输入[1]:
df = pd.DataFrame([[1, 2], [1, 2], [5, 6]], columns=['A', 'B'])
{k: list(v) for k,v in df.groupby("A")["B"]}

结果[1]:

{1: [2, 2], 5: [6]}

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