熊猫按列分组并创建带有结果的字典

时间:2019-12-01 18:10:42

标签: python pandas numpy

我的数据框看起来像这样

输入

    NAME         TYPE       GROUP
1   Apple       Source  project1
2   Orange      Target  project1
3   pear        Target  project1
4   pineapple   Target  project1
5   plum        Source  project2
6   pomegranate Target  project3
7   quince      Target  project4
8   raspberry   Source  project3
9   strawberry  Target  project4

我需要将最后一列分组的输出,并创建一个以键为源,目标为值列表的字典。

要明确:在项目1中,“苹果”是源,目标是“橙色”,“梨”,“菠萝”

预期输出

{ Apple:["Orange","pear","pineapple"], plum:["pomegranate","quince"],raspberry:["strawberry"] }

2 个答案:

答案 0 :(得分:-1)

查看DataFrame.to_dict() function内置的熊猫,这似乎是您想要的。

编辑

我对下面的函数采用了另一种方法,该方法应该在不使用groupby函数的情况下也能达到相同的结果。它只是使用df作为参数,并通过使用标准DataFrame过滤来构建您要查找的字典。

def dictFromDf(df):
    keys = df['Name'][df.Type == 'Source']
    key_group_tuples = []
    for key in keys:
       key_group_tuples.append((key,df.Group[df['Name']== key].values[0]))

    final_dict = {}
    for pair in key_group_tuples:
        final_dict[pair[0]] = list(df.Name[(df.Name != pair[0])
        & (df.Group == pair[1])].values) 

    return final_dict

答案 1 :(得分:-1)

我假设您的源DataFrame(经过一些修正 GROUP )是:

          NAME    TYPE     GROUP
1        Apple  Source  project1
2       Orange  Target  project1
3         pear  Target  project1
4    pineapple  Target  project1
5         plum  Source  project2
6  pomegranate  Target  project2
7       quince  Target  project2
8    raspberry  Source  project3
9   strawberry  Target  project3

定义以下功能:

def descr(grp):
    src = grp[grp.TYPE == 'Source'].NAME.tolist()[0]
    trg = grp[grp.TYPE == 'Target'].NAME.tolist()
    return pd.Series([src, trg], index=['key', 'value'])

然后按以下方式应用它:

df.groupby('GROUP').apply(descr).set_index('key').value.to_dict()

结果是:

{'Apple': ['Orange', 'pear', 'pineapple'],
 'plum': ['pomegranate', 'quince'],
 'raspberry': ['strawberry']}

要分析此代码的工作方式,请“逐步”运行它,即:

  • df.groupby('GROUP').apply(descr)开始-您将获得一个 DataFrame- descr 对所有格鲁普斯的组合结果。
  • 然后添加set_index('key')-您将看到带有 key 的DataFrame 作为索引。
  • 最后添加value.to_dict()-得到最终结果。