假设我有一个带有两列的pandas数据框(column A和Column B):
对于'A'列中的值,在'B'列中有多个值。
我想创建一个字典,每个键(key)都有多个值,这些值也应该是唯一的。请为我提供一种实现方法。
一种方法是按列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()))
等方式...
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]}
Series.tolist
(相当神奇)...您可以使用许多 Series/DataFrame 方法对 groupby 进行操作(我认为这只是.apply(lambda s: s.tolist())
的简写)。 - Andy Hayden