晚上好, 我的代码理解了我需要它做的事情,但是我很好奇为什么它会工作。
dft2 = pd.DataFrame(
np.array([
['1','A','WW'], ['1','B','XX'], ['3','A','LL'], ['1','D','ZZ'],['2','A','LL'],['3','E','LL']
]), columns=['channel','state', 'rbc_security_type1']
)
display(dft2)
channel state rbc_security_type1
0 1 A WW
1 1 B XX
2 3 A LL
3 1 D ZZ
4 2 A LL
5 3 E LL
d = {
('state',np.size),
('rbc_security_type1',np.size)
}
dft2_Grp = dft2.groupby('channel')['state'].agg(d).reset_index()
dft2_Grp = dft2.groupby('channel')['rbc_security_type1'].agg(d).reset_index()
dft2_Grp = dft2_Grp.rename(columns={'state':'State_Count', 'rbc_security_type1':'rbc_security_type1_Count'}, level=0) # rename the column header in the groupby
display(dft2_Grp)现在,这两个聚合产生了相同的输出,我想知道为什么?
dft2_Grp = dft2.groupby('channel')['state'].agg(d).reset_index()
dft2_Grp = dft2.groupby('channel')['rbc_security_type1'].agg(d).reset_index()
channel State_Count rbc_security_type1_Count
0 1 3 3
1 2 1 1
2 3 2 2当我们应用多列计数时,当我们应用.groupby(‘信道’)column.agg(D)时,究竟发生了什么?D ('state',np.size),(‘rbc_security_type1 1’,np.size)的聚合对我来说是有意义的,但是为什么在agg(d)已经有我想要依赖的两个列的情况下只需要添加一个列?为什么这两列都不需要? 如果我省略了[] (我认为这是有意义的),然后使用下面的命令,我将得到输出:
dft2_Grp = dft2.groupby('channel').agg(d).reset_index(). The output follows:
channel State_Count rbc_security_type1_Count
state rbc_security_type1 state rbc_security_type1
0 1 3 3 3 3
1 2 1 1 1 1
2 3 2 2 2 2彼得
发布于 2018-03-17 14:10:55
您得到相同的输出,因为调用相同的函数两次,每个组的函数返回值的计数。
d = {
('state',np.size),
('rbc_security_type1',np.size)
}
dft2_Grp = dft2.groupby('channel')['state'].agg(d).reset_index() 对于每个组的列state,channel返回两个名为state和rbc_security_type1的新列,它们具有相同的aggreagte函数np.size。
dft2_Grp = dft2.groupby('channel')['rbc_security_type1'].agg(d).reset_index() 对于每个组的列rbc_security_type1,channel返回两个名为state和rbc_security_type1的新列,它们具有相同的aggreagte函数np.size。
所以更好的方法是使用它,比如:
d = {
('a',np.size),
('b','first')
}
dft2_Grp = dft2.groupby('channel')['state'].agg(d).reset_index()
print(dft2_Grp)
channel a b
0 1 3 A
1 2 1 A
2 3 2 A对于列,state通过不同的函数创建新列- first返回每个组的第一个值。
d = {
'state': np.size,
'rbc_security_type1':np.size
}
dft2_Grp = dft2.groupby('channel').agg(d).reset_index()
print(dft2_Grp)
channel state rbc_security_type1
0 1 3 3
1 2 1 1
2 3 2 2对于不带元组的聚合字典(更常见)是在dictionary中定义了aggreate函数的列,因此对于state,定义函数np.size,对于rbc_security_type1定义相同:
d = {
('a',np.size),
('b',np.size)
}
dft2_Grp = dft2.groupby('channel').agg(d).reset_index()
print(dft2_Grp)
channel state rbc_security_type1
b a b a
0 1 3 3 3 3
1 2 1 1 1 1
2 3 2 2 2 2这意味着对于所有列都使用了字典中的所有函数--在这里,双np.size和在列中返回MultiIndex,用于分隔输入列。
https://stackoverflow.com/questions/49337797
复制相似问题