【问题标题】:Pandas group by a column and create a dictionary with resultPandas 按列分组并创建带有结果的字典
【发布时间】:2019-12-02 03:12:22
【问题描述】:

我的数据框是这样的

输入

    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

我需要对最后一列进行分组的输出,并创建一个字典,其中键作为源,目标作为值列表。

要明确:“Apple”是源,其目标是 project-1 中的“Orange”、“pear”、“pineapple”

预期输出

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

【问题讨论】:

  • 如果一个项目有多个“来源”怎么办?
  • 不会有!只有一个来源!
  • 为什么plum 应该覆盖quince 值?他们在不同的项目中

标签: python pandas numpy


【解决方案1】:

我假设您的源 DataFrame(有一些关于 )是:

          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() - 得到最终结果。

【讨论】:

    【解决方案2】:

    查看DataFrame.to_dict() function 内置的 Pandas,这似乎就是您要找的东西。

    编辑

    我对下面的函数采取了另一种方法,它应该在不使用 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
    

    【讨论】:

    • 我可以创建一个字典,但我不能创建一个条件来匹配给定的输出!
    猜你喜欢
    • 2020-12-20
    • 2020-05-17
    • 2020-10-05
    • 2021-10-28
    • 2010-10-30
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多