使用 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
会收到 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))
这应该可以解决 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')
我正在尝试根据帐号添加一列值,并将结果显示在新列中。此外,我将合同帐户的第一个实例标识为唯一值,将其他实例标识为重复值。 例如:
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
会收到 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))
这应该可以解决 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')