【问题标题】:Grouping by a Pandas dataframe and putting column back按 Pandas 数据框分组并将列放回
【发布时间】:2020-12-12 21:47:57
【问题描述】:

我有以下熊猫数据框:

我想复制以下 SQL 查询:

SELECT
cars, 
city, 
CASE WHEN miles_travelled=100 THEN SUM(complaints)/SUM(calls) ELSE 0 END as ratio
FROM table
GROUP BY cars, city

这是我最近的一次:

table.groupby(['cars','city','miles_travelled'])['complaints','calls'].sum()

谁能帮忙。

【问题讨论】:

  • 从 SQL 的角度来看,这不是一个有效的聚合查询。 miles_travelledselect 子句中,但不在group by 子句中。
  • miles_travelled 不在 select 子句中。它在case语句中,它是聚合的
  • 我不熟悉 SQL CASE 方法,所以您是否希望 miles_travelled 成为分组数据框中的另一个索引(具有汽车、城市和英里旅行的每个组合的比率值)或您是否只需要汽车和城市的每个组合的比率值,但比率的合计值不包括miles_travelled = 100 的投诉/电话?无论哪种情况,您最好先添加一个比率列,然后再进行分组聚合。

标签: sql pandas sqlite


【解决方案1】:

如果您只想将ratio 设为citycars 的组合,并忽略complaintscalls 之和的商,忽略miles_travelled 为100 的行,那么这个会工作的。

# filter to ignore rows where miles_travelled = 100
(table[table['miles_travelled'] != 100]
 # groupby city and cars and select the complaint and calls columns
 .groupby(['city','cars'])['complaints','calls']
 # sum the selected columns
 .agg(sum)
 # make the ratio column which is the sum of complaints / sum of calls
 .assign(ratio = lambda x: x['complaints'] / x['calls']))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2019-03-08
    • 1970-01-01
    • 2017-01-18
    • 2021-09-29
    • 1970-01-01
    • 2021-05-03
    • 2022-07-06
    相关资源
    最近更新 更多