我有一个这样的数据帧

MV id   NAME   ADDRESS  DOC  DOCTYPE PHONE
1  100  Mark   Home     299  NI      {123,456}
2  100  John   Work     A123 Pass    {789,101}
3  100         Club

我想要做的是将具有相同id的列合并到字典中的一个单元格中,如下所示,并从另一列中创建字典中值的键

id   NAME              ADDRESS                          DOC                    PHONE
100  {1:Mark,2:John}   {1:'Home',2:'Work',3:'Club'}     {NI:'299',Pass:'A123'} {1:{123,456},2:{789,101}}

如您所见,我使用了2列作为键列mv,在(Name,Address,Phone)中用作键 我在DOC中使用了列DOCTYPE作为关键字,我怎么才能做到这一点呢?我试过了

agg={'id':'first','NAME':dict,'ADDRESS':dict,'PHONE':dict}
    df_new=df.groupby(['CUSTOMER_CODE'],as_index=False).aggregate(agg)
    return df_new

但它给了我这个输出

id   Name             Address                 Phone
100  {0:Mark,1:John}  {0:Home,1:Work,2:Club}  {0:{123,456},1:{789,101}}

推荐答案

假设您的空单元格是NaN,您可以使用自定义的groupby.agg:

让我们首先看看如何使用单个引用进行聚合:

df.set_index('MV').groupby('id', as_index=False).agg(lambda s: s.dropna().to_dict())

输出:

    id                    NAME                            ADDRESS                    DOC               DOCTYPE                             PHONE
0  100  {1: 'Mark', 2: 'John'}  {1: 'Home', 2: 'Work', 3: 'Club'}  {1: '299', 2: 'A123'}  {1: 'NI', 2: 'Pass'}  {1: '{123,456}', 2: '{789,101}'}

generic answer for different references

现在,我们可以对其进行调整,以使用不同的引用列:

def f(s):
    return s.dropna().to_dict()

d = {'MV': ['NAME', 'ADDRESS', 'PHONE'],
     'DOCTYPE': ['DOC']
    }

out = (pd.concat([df.set_index(k).groupby('id')[v].agg(f)
                 for k, v in d.items()], axis=1)
         .reset_index()
      )

输出:

    id                    NAME                            ADDRESS                             PHONE                            DOC
0  100  {1: 'Mark', 2: 'John'}  {1: 'Home', 2: 'Work', 3: 'Club'}  {1: '{123,456}', 2: '{789,101}'}  {'NI': '299', 'Pass': 'A123'}

Python相关问答推荐

两极按组颠倒顺序

Pandas基于另一列的价值的新列

如何分割我的收件箱,以便连续的数字各自位于自己的收件箱中?

如何判断. text文件中的某个字符,然后读取该行

Pandas 群内滚动总和

socket.gaierror:[Errno -2]名称或服务未知|Firebase x Raspberry Pi

使用多个性能指标执行循环特征消除

使用pandas、matplotlib和Yearbox绘制时显示错误的年份

如何使用scipy从频谱图中回归多个高斯峰?

重新匹配{ }中包含的文本,其中文本可能包含{{var}

通过Selenium从页面获取所有H2元素

为什么默认情况下所有Python类都是可调用的?

数据抓取失败:寻求帮助

Python解析整数格式说明符的规则?

Pandas:将多级列名改为一级

如何将多进程池声明为变量并将其导入到另一个Python文件

判断solve_ivp中的事件

旋转多边形而不改变内部空间关系

在pandas/python中计数嵌套类别

从旋转的DF查询非NaN值