【问题标题】:Aggregate function for arranging a dataframe用于安排数据框的聚合函数
【发布时间】:2017-10-17 01:47:06
【问题描述】:

我有以下数据框,

>>> data = pd.DataFrame({'Name': ['CTA15', 'CTA15', 'AC007', 'AC007', 'AC007'], 
'ID': [22, 22, 2, 2, 2], 
'Sample':['PE12', 'PL14', 'AE29', 'AE04', 'PE03'], 
'count_col' : [2, 2, 3, 3, 3]})

>>> data
   ID   Name Sample  count_col
0  22  CTA15   PE12          2
1  22  CTA15   PL14          2
2   2  AC007   AE29          3
3   2  AC007   AE04          3
4   2  AC007   PE03          3

我需要重新排列我的数据框如下,

 Name       Sample      count_col
    CTA15       PE12          2
                PL14        
    AC007       AE10          3
                AE29    
                PE03    

我尝试的是,

pd.pivot_table(All_variants_REL,index=["Name",'Sample'],
               values=['Count'],aggfunc={'Name':np.size})

但它没有在计数列中显示准确的计数 任何帮助都会很棒..

【问题讨论】:

    标签: python pandas group-by aggregate


    【解决方案1】:

    看来你需要mask + astype by duplicated 创建的布尔掩码:

    注意:我将强制转换添加到 str,因为否则会在列 count(带整数的字符串)中得到混合值,并且可能会破坏一些 pandas 函数。

    注意 1 - 如果 Name 列中的值已排序,则解决方案有效。

    cols = ['Name','count']
    df[cols] = df[cols].astype(str).mask(df.duplicated(['Name']), '')
    print (df)
        Name  ID Sample count
    0  CTA15  22   PE12     2
    1         22   PL14      
    2  AC007   2   AE29     3
    3          2   AE04      
    4          2   PE03    
    

    如果需要NaNs,只需省略, - 但最后一列的值将转换为float(因为NaN 是浮点数)

    cols = ['Name','count']
    df[cols] = df[cols].mask(df.duplicated(['Name']))
    print (df)
        Name  ID Sample  count
    0  CTA15  22   PE12    2.0
    1    NaN  22   PL14    NaN
    2  AC007   2   AE29    3.0
    3    NaN   2   AE04    NaN
    4    NaN   2   PE03    NaN  
    

    lists 可以使用:

    cols = ['Name','count', 'ID']
    df = df.groupby(cols)['Sample'].apply(list).reset_index()
    print (df)
        Name  count  ID              Sample
    0  AC007      3   2  [AE29, AE04, PE03]
    1  CTA15      2  22        [PE12, PL14]
    

    【讨论】:

    • 感谢您的解决方案如果我在数据框中有更多列。我还需要显示这些列吗?
    • 嗯,这取决于你需要什么。如果数据在列中重复,显然不是问题。另一种可能的解决方案是在 Sample 列中创建包含数据的列表,但是使用一些 pandas 函数会更难。
    【解决方案2】:

    为什么不简单地设置一个多索引?如果您的列比示例 DataFrame 中的多得多,那么这样做将转化为显示所有列。

    >>> data = pd.DataFrame({'Name': ['CTA15', 'CTA15', 'AC007', 'AC007', 'AC007'], 
    'ID': [22, 22, 2, 2, 2], 
    'Sample':['PE12', 'PL14', 'AE29', 'AE04', 'PE03'], 
    'count_col' : [2, 2, 3, 3, 3]})
    

    (旁注:我不建议使用名称为 count 的列,因为它是 DataFrame 方法,并且会导致问题。例如,data.count 不会返回 Series正如我们所料。)

    >>> data
       ID   Name Sample  count_col
    0  22  CTA15   PE12          2
    1  22  CTA15   PL14          2
    2   2  AC007   AE29          3
    3   2  AC007   AE04          3
    4   2  AC007   PE03          3
    

    设置多索引,这将作为任意大DataFrame的解决方案。

    >>> data.set_index(['Name', 'Sample'])
                  ID  count_col
    Name  Sample               
    CTA15 PE12    22          2
          PL14    22          2
    AC007 AE29     2          3
          AE04     2          3
          PE03     2          3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多