Агрегация и группировка с пандами - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь добавить столбец значений на основе номеров счетов и отобразить результат в новом столбце.Кроме того, я идентифицирую первый экземпляр контокоррентного счета как уникальное значение, а остальные - как дубликаты.Например:

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 ]

1 голос
/ 27 мая 2019

Используйте обратное значение 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 и 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                   -
1 голос
/ 27 мая 2019

Это должно сделать трюк для столбца 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
0 голосов
/ 02 июня 2019

Обновление: последовательность команд меняет результат, дух!Эта последовательность работала для меня:

#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') 
...