使用pandas计算聚合结果的频率

时间:2017-12-18 02:36:32

标签: python pandas

从广义上讲,我有来自Kaggle的智能仪表数据集,我试图按房子计算第一个和最后一个测量值,然后尝试聚合以查看有多少房屋开始(或结束)报告给定的一天。我完全不同于下面我所追求的方法。

在SQL中,在浏览数据时,我经常使用以下内容:

protocol HomePostCellDelegate {
    func didLike(for cell: HomePostCell)
}

class HomePostCell: UICollectionViewCell {

    var delegate: HomePostCellDelegate?

    lazy var likeButton: UIButton = {
        let button = UIButton(type: .system)
        button.setImage(#imageLiteral(resourceName: "heart_unselected").withRenderingMode(.alwaysOriginal), for: .normal)
        button.addTarget(self, action: #selector(handleLike), for: .touchUpInside)
        return button
    }()


    @objc func handleLike() {
        delegate?.didLike(for: self)
    }

    lazy var likesLabel: UILabel = {
        let label = UILabel()
        label.font = UIFont(name: "AvenirNext-Regular", size: 20)
        label.textColor = UIColor.black
        label.isHidden = true
        let userInfo = ["likesLabelInfo": label]
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "refresh"), object: nil, userInfo: userInfo)
        return label
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)

    }
    static let homePostCellNotificationName = NSNotification.Name(rawValue: "homePostCellRaw")

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

我试图在Pandas中复制这个逻辑并失败。我可以得到像:

这样的初始聚合
SELECT Max_DT, COUNT(House_ID) AS HouseCount 
FROM 
(
    SELECT House_ID, MAX(Date_Time) AS Max_DT 
    FROM ElectricGrid GROUP BY HouseID
) MeasureMax 
GROUP BY Max_DT

但是我没有得到外部查询。具体来说,我不知道聚合列的调用方式。如果我执行describe(),它会在上面的示例中显示为Date_Time。我尝试重命名列:

house_max = house_info.groupby('House_Id').agg({'Date_Time' :['max']})

我找到了一个关于重命名结果的StackOverflow discussion并尝试应用它:

house_max.columns = ['House_Id','Max_Date_Time']

我仍然发现describe()返回Date_Time作为列名。

house_max.columns = ["_".join(x) for x in house_max.columns.ravel()]

在重命名示例中,我的第二个查询无法找到Date_Time或Max_Date_Time。在后一种情况下,拉威尔代码在运行时似乎找不到House_Id。

1 个答案:

答案 0 :(得分:1)

这看起来很奇怪,我认为你的代码无法找到House_Id字段。在House_Id上执行groupby后,它将成为一个您无法作为列引用的索引。

这应该有效:

house_max = house_info.groupby('House_Id').agg({'Date_Time' :['max']})
house_max.columns = ["_".join(x) for x in house_max.columns.ravel()]
start_end_collate = house_max.groupby('Date_Time_max').size()

或者你可以删除多级列:

house_max.columns = house_max.columns.droplevel(0)
start_end_collate = house_max.groupby('max').size()