使用 Pandas 进行聚合和分组

Aggregation and Grouping with Pandas

我正在尝试根据帐号添加一列值,并将结果显示在新列中。此外,我将合同帐户的第一个实例标识为唯一值,将其他实例标识为重复值。 例如:

Index   CA#   Duplicate?    $     $$
1      1101   True        440.4  880.80 
2      1101   False       440.4  -   
3      1102   True        440.8  440.80 
4      1103   True        441.2  441.20 
5      1106   True        442.4  1,327.20 
6      1106   False       442.4  -   
7      1106   False       442.4  -   

我的第一列 'CA#' 是我想标记为 True(or 1) 的标识符,如果它们是第一个也是唯一的 CA#,否则,我希望它们标记为 [=16] =]. 例如,CA# 1101 on Index 1 会收到 TrueCA# 1101 on Index 2 会收到 False

然后,我尝试使用该 True 标志对每个 CA# 链接到 $ 列的总数求和。在 CA#1101 的情况下,总数 $$880.80。 到目前为止,我只尝试生成一个新列,该列具有 CA# 列上唯一值的布尔标识符,但我在我的代码创建的新系列上只得到 True 值,我知道这是错误的.

import pandas as pd
from pandas import DataFrame, Series
import numpy as np

file_name= ('A:\LEO\Documents\Mock data.xlsx')
sheet_name= ('Sheet1')
data = pd.read_excel(io= file_name, sheet= sheet_name)
data.sort_values('CA#', inplace= True)
data_ltd = DataFrame(data, columns=['CA#','$'])
bool_series = data_ltd['CA'].duplicated()
data_ltd ['bool_series'] = bool_series
print(data_ltd[bool_series].head(10))

这应该可以解决 Duplicated 列的问题:

df = pd.DataFrame({'CA#': [1101, 1101, 1102,1103, 1106, 1106, 1106]})
seen = set()
def already(x):
    global seen
    if x in seen:
        return False
    else:
        seen.add(x)
        return True

df['Duplicate'] = df['CA#'].apply(already)
df
#     CA#  Duplicate
# 0  1101       True
# 1  1101      False
# 2  1102       True
# 3  1103       True
# 4  1106       True
# 5  1106      False
# 6  1106      False

使用duplicated的倒数:

~df.duplicated('CA#')

0     True
1    False
2     True
3     True
4     True
5    False
6    False
dtype: bool
df['Duplicate?'] = ~df.duplicated('CA#')

    CA#  Duplicate?      $        $$
0  1101        True  440.4    880.80
1  1101       False  440.4         -
2  1102        True  440.8    440.80
3  1103        True  441.2    441.20
4  1106        True  442.4  1,327.20
5  1106       False  442.4         -
6  1106       False  442.4         -

要获取您的 $$ 列,我们可以使用 groupby and np.where:

df['$$'] = df.groupby('CA#')['$'].transform('sum')
df['$$'] = np.where(df['$$'].duplicated(), '-', df['$$'])

    CA#  Duplicate?      $                  $$
0  1101        True  440.4               880.8
1  1101       False  440.4                   -
2  1102        True  440.8               440.8
3  1103        True  441.2               441.2
4  1106        True  442.4  1327.1999999999998
5  1106       False  442.4                   -
6  1106       False  442.4                   -

更新:命令序列改变了结果,呃!这个序列对我有用:

#Start with sorting the values    
data_fr.sort_values(by='CA',ascending= True, inplace= True) 
#Identify duplicates    
data_fr['Unique Px']= ~data_fr.duplicated('CA') 
#Group and aggregate in a new column
data_fr['$$'] = data_fr.groupby('CA')['$'].transform('sum')