Python 按一列对数据帧进行分组并基于该列添加信息

Python 按一列对数据帧进行分组并基于该列添加信息,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有这样一个数据帧: df = pd.DataFrame({1:[1,1,1,2,2,2,3,4,5,6,7,8,9], 2:["a","a","x","b","b","y","c","d","e","f","g","h"

我有这样一个数据帧:

df = pd.DataFrame({1:[1,1,1,2,2,2,3,4,5,6,7,8,9],
                   2:["a","a","x","b","b","y","c","d","e","f","g","h","i"],
                   3:[0.5,0.6,0.7,0.8,0.9,0.10,0.11,0.13,0.13,0.14,0.15,0.16,0.17]})
我想:

  • 按第一列对项目进行分组,使其包含唯一的值
  • 将第三列的平均值附加到此分组
  • 将第二列的信息附加到每个相应的第一列
  • 我可以使用以下方法执行(1)和(2):

    In [33]: df.groupby(1).mean()
    Out[33]: 
          3
    1      
    1  0.60
    2  0.60
    3  0.11
    4  0.13
    5  0.13
    6  0.14
    7  0.15
    8  0.16
    9  0.17
    
    但是,我不确定如何将第二列附加到分组

    我尝试过按多个列进行分组:

    In [34]: df.groupby([1,2]).mean()
    Out[34]: 
            3
    1 2      
    1 a  0.55
      x  0.70
    2 b  0.60
    3 c  0.11
    4 d  0.13
    5 e  0.13
    6 f  0.14
    7 g  0.15
    8 h  0.16
    9 i  0.17
    
    但在实际数据集中,它遗漏了几个条目

    如果您注意到,在数据框中,每个条目的第二列数据都有一些差异(第1列下的数字1有2个“a”和一个“x”,而数字2有2个“b”和一个“y”)。这是因为在实际数据集中,由于错误和字符串数据中的微小差异(但不重要),条目之间存在微小差异

    编辑

    以上只是对问题的概念性描述。如果你需要更具体的东西。在查找平均值时,我想按
    “客户名称”和
    “客户地址”列进行分组,但由于某种原因,同时按这两列进行分组会导致条目丢失。如果我纯粹按照
    “客户名称”
    进行分组,则有4300多个条目

    In [35]: len(ensemble.("CUSTOMERS NAME").mean())
    Out[35]: 4376
    
    但是,如果我同时按姓名和地址分组,它会大幅下降:

    In [36]: len(ensemble.groupby(["CUSTOMERS NAME","CUSTOMER ADDRESS"]).mean())
    Out[36]: 4154
    
    我知道某个地方出了问题,因为
    “CUSTOMERS NAME”
    列中唯一值的总数是4376


    为了澄清,输出应该是一个有三列的数据帧。第一个是客户名称,第二个是客户名称后的地址(第一个可以),第三个是该客户交易的平均值。

    如果
    2
    col中的
    first
    值可以,您可以使用:

    ,如果需要所有值,您可以有一个列表:

    In [586]: x = df.groupby(1, as_index=False).agg({2: list, 3:'mean'})
    
    In [587]: x
    Out[587]: 
       1          2     3
    0  1  [a, a, x]  0.60
    1  2  [b, b, y]  0.60
    2  3        [c]  0.11
    3  4        [d]  0.13
    4  5        [e]  0.13
    5  6        [f]  0.14
    6  7        [g]  0.15
    7  8        [h]  0.16
    8  9        [i]  0.17
    

    您的预期输出是什么?一旦您分组,每个组将只有一个条目。所以不能像那样简单地附加第二列值。您可以为每个组创建第二列值列表,并将其附加到分组的df。@MayankPorwal它应该是一个包含三列的数据框。第一个是客户的姓名,第二个是客户姓名后的地址(第一个可以),第三个是该客户交易的平均值。请检查我的答案。
    In [583]: x = df.groupby(1, as_index=False).agg({2:'first', 3:'mean'})
    
    In [584]: x
    Out[584]: 
       1  2     3
    0  1  a  0.60
    1  2  b  0.60
    2  3  c  0.11
    3  4  d  0.13
    4  5  e  0.13
    5  6  f  0.14
    6  7  g  0.15
    7  8  h  0.16
    8  9  I  0.17
    
    In [586]: x = df.groupby(1, as_index=False).agg({2: list, 3:'mean'})
    
    In [587]: x
    Out[587]: 
       1          2     3
    0  1  [a, a, x]  0.60
    1  2  [b, b, y]  0.60
    2  3        [c]  0.11
    3  4        [d]  0.13
    4  5        [e]  0.13
    5  6        [f]  0.14
    6  7        [g]  0.15
    7  8        [h]  0.16
    8  9        [i]  0.17