我有一个csv,其中包含以下列
Date isAccepted
有很多重复的日期,isAccepted是一个布尔值列,包含0和1。我想计算特定日期的0计数。
我正在尝试:
df['Count'] = df.groupby('Date').apply(lambda isAccepted: (isAccepted == 0).sum())
但是返回的列是NaN。谁能告诉我代码有什么问题。
谢谢
答案 0 :(得分:0)
尝试以下代码,希望对您有所帮助
Last-Modified
希望这会有所帮助。
答案 1 :(得分:0)
问题是,当您使用groupby('Date')时,会创建一个新的DataFrame,现在将'Date'列作为索引,而不再是列,因此,当您的代码尝试将值分配给df ['Count '](原始索引为0、1、2、3 .... n的数据框,没有“日期”),大熊猫找不到放置它的位置,因此它用NAN填充['Count']列。要解决此问题,请尝试:
DataFrame:
data={'Date':['04/09/2019','04/09/2019','04/09/2019','04/09/2019','04/09/2019','04/09/2019','04/09/2019','04/09/2019',
'05/09/2019','05/09/2019','05/09/2019','05/09/2019','05/09/2019','05/09/2019','06/09/2019','06/09/2019',
'06/09/2019','06/09/2019','06/09/2019','06/09/2019','06/09/2019'],
'isAccepted':[0,0,0,1,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0]}
df=pd.DataFrame(data,columns=['Date','isAccepted'])
使用groupby()生成的新索引创建第二个DataFrame:
df2=df.groupby('Date').sum()
现在,您可以根据需要尝试使用代码,熊猫将找到将所得的零和放在哪里,代码行的左边和第二项现在具有相同的索引:
df2['Count']=df.groupby('Date').apply(lambda column: (column == 0).sum())['isAccepted']
希望这可以解决您对为什么使用NAN的疑问。
答案 2 :(得分:0)
如果需要用汇总值填充新列,请使用GroupBy.transform
:
df['Count'] = (df['isAccepted'] == 0).groupby(df['Date']).transform('sum')
带有DataFrame.assign
的新帮助程序列的类似解决方案:
df['Count'] = df.assign(new=df['isAccepted'] == 0).groupby('Date')['new'].transform('sum')
您的解决方案是必须用transform
进行更改的,但是如果有多个组,它应该很慢:
df['Count'] = df.groupby('Date')['isAccepted'].transform(lambda column: (column == 0).sum())