根据特定列中的值计算行数,从现有的数据帧创建新的数据帧。
根据特定列中的值计算行数,从现有的数据帧创建新的数据帧。
我有一个数据框如下所示,\n
|order_id|customername|product_count| |1 |a |2 | |2 |b |-1 | |3 |Q |3 | |4 |a |-1 | |5 |c |-1 | |6 |Q |-1 | |7 |d |-1 |
\n我想要的是另一个数据框,其中包含customername为\'Q\'的行数和customername中其他项目的行数。如下所示,其中test2代表\'Q\',test1代表其他项目。百分比列为(总请求数/ customername的计数)* 100,在这种情况下为(5/7)* 100和(2/7)* 100\n|用户|总请求数|百分比|\n|test1 |5 | 71.4 |\n|test2 |2 | 28.5 |\n
问题的出现原因是想要在现有的DataFrame中根据特定列的值进行计数,并将计数结果创建为新的DataFrame。解决方法是使用pandas的Series.value_counts函数比较列'customername'中的值,并重命名索引的值,然后创建新的DataFrame。在这个解决方案中,还需要添加一个名为'Percentage'的新列。
解决方法如下:
1. 首先,创建原始的DataFrame,包含三列'order_id'、'customername'和'product_count'。
2. 使用df['customername'].eq('Q').value_counts()函数比较列'customername'中的值是否等于'Q',并计算每个结果的计数。
3. 使用rename函数修改计数结果的索引值,将True重命名为'test2',将False重命名为'test1'。
4. 使用rename_axis函数为计数结果的索引名称命名为'users',并使用reset_index函数将计数结果转换为DataFrame,并命名为'Total request'。
5. 使用df1['Total request'].div(df1['Total request'].sum()).mul(100).round(2)计算百分比,并将结果添加为新的一列'Percentage'。
6. 打印输出新的DataFrame,其中包含'users'、'Total request'和'Percentage'三列。
如果想要添加额外的列,比如'Percentage',只需在第4步和第5步之间添加以下代码:
df1['Percentage'] = df1['Total request'].div(df1['Total request'].sum()).mul(100).round(2)
如果出现'KeyError: 'Total request''的错误,可能是由于在使用df1['Total request']时出现了问题。可以检查是否正确创建了df1,即是否使用了df1 = s.rename_axis('users').reset_index(name='Total request')
的代码。
最后,通过测试数据来验证解决方案是否有效。