用于排列数据帧的聚合函数

2024-09-29 04:21:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧

>>> 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})

但在计数列中没有显示准确的计数 任何帮助都很好


Tags: 数据samplenameiddatacountcolpd
2条回答

似乎需要^{}+^{}通过^{}创建的布尔掩码:

注意:我将cast添加到str,因为else会在count列(带int的字符串)中获得混合值,一些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是float)

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]

为什么不简单地设置一个多索引呢?如果您有比示例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

相关问题 更多 >