Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在dataframe中使用多类别列计算行数的有效方法?_Python_Pandas_Dataframe - Fatal编程技术网

Python 在dataframe中使用多类别列计算行数的有效方法?

Python 在dataframe中使用多类别列计算行数的有效方法?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有headuid、col1、col2的数据帧,其中col1具有k1唯一值(例如a、b、c),col2具有k2唯一值(例如“低”、“高”)。按uid分组后,如果我想计算被col1=='a'的数量,我会这样做 df.groupby("uid")['col1'].apply(lambda group: sum(group=='a')).reset_index(name="a_cnt") 如果我想计算被col1=='a'和col2='low'的数量,我会这样做 df.groupby("uid

我有一个带有head
uid、col1、col2
的数据帧,其中
col1
具有
k1
唯一值(例如
a、b、c
),
col2
具有
k2
唯一值(例如“低”、“高”)。按
uid
分组后,如果我想计算被
col1=='a'
的数量,我会这样做

df.groupby("uid")['col1'].apply(lambda group: sum(group=='a')).reset_index(name="a_cnt")
如果我想计算被
col1=='a'和col2='low'
的数量,我会这样做

df.groupby("uid")['col1', 'col2'].apply(lambda group: sum((group['col1']=='a') & (group['col2']=='low'))).reset_index(name="a_low_cnt")  

是否有其他有效的方法可以做到这一点?

创建
掩码
,添加到数据框中,使用“按转换为数字”和“最后一次聚合”
求和
,以提高性能:

#first mask
#m = (df['col1']=='a')

#second mask
m = (df['col1']=='a') & (df['col2']=='low')

df = df.assign(new = m.astype(int)).groupby("uid")['new'].sum()
或:


创建
掩码
,使用convert to numbers by和last aggregate
sum添加到数据帧,以提高性能:

#first mask
#m = (df['col1']=='a')

#second mask
m = (df['col1']=='a') & (df['col2']=='low')

df = df.assign(new = m.astype(int)).groupby("uid")['new'].sum()
或:


谢谢在代码的第二部分中,我应该使用
df.groupby('uid')['col1','col2']
还是
df.groupby('uid')['col1','col2']]
?它们都给出了相同的结果,有什么不同吗?谢谢。在我的代码的第二部分中,我应该使用
df.groupby('uid')['col1','col2']
还是
df.groupby('uid')['col1','col2']]]
?它们都给我相同的结果,有什么区别吗?