Python group按多个列排序,并找到计数最高的列

fdbelqdn  于 2022-12-05  发布在  Python
关注(0)|答案(1)|浏览(123)

我遇到了一个问题,我必须找到出现次数最多的“详细信息”(“ID”计数),用于特定的“单元”和“功能”
因此,在以下示例中,对于单元= 0011,功能= 0001,大多数“ID”与细节= 546545153113131相关联。类似地,对于单元= 0011,功能= 0026,大多数“ID”与细节= 546545153113132相关联。对于单元= 0012,功能= 0001,大多数“ID”与详细资料= 546545153113131相关联。对于单元= 0012,功能= 0026,大多数“ID”与详细资料= 546545153113132相关联。
这里的数据框相当大,包含5百万行。我正在从数据框中的文本文件阅读这些数据。

import pandas as pd
  
# initialize list of lists
data = [['000000000001', '0011','0001','546545153113131'],    
        ['000000000002', '0011','0026','546545153113132'],        
        ['000000000004', '0011','0001','546545153113133'],
        ['000000000005', '0011','0001','546545153113131'],    
        ['000000000006', '0012','0001','546545153113131'],    
        ['000000000007', '0012','0026','546545153113132'],
        ['000000000009', '0012','0001','546545153113133'],
        ['000000000010', '0012','0001','546545153113131']

         ]
  
# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['ID', 'UNIT', 'FUNCTION', 'DETAILS'])
df.sort_values(by=['ID', 'UNIT', 'FUNCTION'], ascending=[True,True,True])
df.groupby(['UNIT', 'FUNCTION','DETAILS']).count()

上面的代码给了我这个-

ID
UNIT    FUNCTION    DETAILS 
0011    0001     546545153113131    2
                 546545153113133    1
        0026     546545153113132    1
0012    0001     546545153113131    2
                 546545153113133    1
        0026     546545153113132    1

我所期待的是一个数据框架,它可以给予我这个-

UNIT    FUNCTION    DETAILS        ID
0011    0001     546545153113131    2
0011    0026     546545153113132    1
0012    0001     546545153113131    2
0012    0026     546545153113132    1

我尝试了几个解决方案-GroupBy pandas DataFrame and select most common value,没有工作。我是一个Python初学者和道歉,如果我写的没有多大意义。

soat7uwm

soat7uwm1#

我建议再次按['UNIT', 'FUNCTION']分组,并且只保留ID具有最大值的第一行:

import pandas as pd
  
data = [['000000000001', '0011','0001','546545153113131'],    
        ['000000000002', '0011','0026','546545153113132'],        
        ['000000000004', '0011','0001','546545153113133'],
        ['000000000005', '0011','0001','546545153113131'],    
        ['000000000006', '0012','0001','546545153113131'],    
        ['000000000007', '0012','0026','546545153113132'],
        ['000000000009', '0012','0001','546545153113133'],
        ['000000000010', '0012','0001','546545153113131']

         ]

df = pd.DataFrame(data, columns=['ID', 'UNIT', 'FUNCTION', 'DETAILS'])
df.sort_values(by=['ID', 'UNIT', 'FUNCTION'], ascending=[True,True,True])

df = df.groupby(['UNIT', 'FUNCTION','DETAILS'], as_index=False).count()

df_out = pd.concat([
    sub_df[sub_df['ID']==sub_df['ID'].max()].iloc[0:1]
    for _, sub_df in df.groupby(['UNIT', 'FUNCTION'])
])

输出量:

UNIT FUNCTION          DETAILS  ID
0  0011     0001  546545153113131   2
2  0011     0026  546545153113132   1
3  0012     0001  546545153113131   2
5  0012     0026  546545153113132   1

相关问题