计算特定列中0的数目

2024-04-23 11:49:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv,它有以下列

Date    isAccepted

有许多重复的日期,isAccepted是一个带有0和1的布尔值列。我想计算一个特定日期0的计数。你知道吗

我正在尝试:

df['Count'] = df.groupby('Date').apply(lambda isAccepted: (isAccepted == 0).sum())

但是返回的列是NaN。谁能说出密码有什么问题吗。你知道吗

谢谢


Tags: csvlambda密码dfdatecountnan计数
3条回答

如果需要用聚合值填充新列,请使用^{}

df['Count'] = (df['isAccepted'] == 0).groupby(df['Date']).transform('sum')

使用带有^{}的新辅助列的类似解决方案:

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())

尝试下面的代码,希望能有所帮助

def countZero(df):
    count = 0
    for accpt in df['isAccepted']:
        if accpt == 0 :
            count += 1
    return count

for date in set(df['Date'].tolist()):

    df['Count'][df['Date'] == date] = countZero(df.groupby('Date').get_group(date))

希望这会有帮助。你知道吗

问题是,当您使用groupby('Date')时,会创建一个新的DataFrame,其中的'Date'列现在作为索引,而不再是列,因此,当您的代码尝试将值赋给df['Count'](原始索引为0,1,2,3….n,没有'Dates')时,pandas找不到放置它的位置,因此它会用NAN填充['Count']列。要解决此问题,请尝试:

数据帧:

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()生成的新索引创建第二个数据帧:

df2=df.groupby('Date').sum()

现在您可以根据需要尝试您的代码,pandas将找到结果零和的位置,代码行的左项和第二项现在具有相同的索引:

df2['Count']=df.groupby('Date').apply(lambda column: (column == 0).sum())['isAccepted']

希望这能解决你的疑问,关于为什么南。你知道吗

相关问题 更多 >