与熊猫的聚集和分组

时间:2019-05-26 23:01:34

标签: python pandas dataframe grouping aggregation

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

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#,否则,我希望将它们标记为False(or 0) 。 例如,CA# 1101 on Index 1将收到True,而CA# 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))

3 个答案:

答案 0 :(得分:1)

这应该可以解决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

答案 1 :(得分:1)

使用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         -

要获取您的$$列,我们可以使用groupbynp.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                   -

答案 2 :(得分:0)

data_fr.sort_values(by ='CA',ascending = True,inplace = True)#开始对值进行排序 data_fr ['Unique Px'] =〜data_fr.duplicated('CA')#识别重复项 data_fr ['$$'] = data_fr.groupby('CA')['$']。transform('sum')#在新列中分组并聚合