任務
我有一個資料框架,看起來像這樣:| 日期 | 花的錢($) | 吃的東西重量|
|---|---|---|
| 2021-01-01 10:00:00 | 350 | 5 |
我想將其離散化,以便它每$X"切割 "行。我想知道一些統計數字,即我每花費$X,就有多少被完成。
因此,如果我使用$500作為一個閾值,前兩行將落在第一個切割中,我可以將其余的列匯總如下:
- 第一行
日期的削減 - 平均
meals_eaten。
- 最小
重量 - 最大
重量。
因此,最終的表格將是這樣的兩行:
。| 日期 | 累計花費($) | 吃過的食物 | 最小重量最大重量 |
|---|---|---|---|
| 2021-01-01 10:00:00 | 600 | 3.5 |
我的方法:我的第一直覺是計算
cumsum()的money_spent(假設資料是按日期排序的),然后我使用pd.cut() 基本上做了一個新列,我們稱之為spent_bin,它決定了每一行的bin。
注意:在這個玩具例子中,spent_bin基本上將是。[0,500]用于前兩行,(500-1000)用于最后兩行。
然后就很簡單了,我做一個groupby spent_bin,然后匯總如下:
.agg({
'date': 'first',
'datings_eaten':'mean',
'returns': ['min', 'max']
})
我嘗試過的東西
import pandas as pd
rows = [
{"date":"2021-01-01 10:00:00","money_spent"。 350, "meatings_eaten":5, "weight":140},
{"date":"2021-01-02 18:00:00","money_spent"。 250, "meatings_eaten":2, "weight":170},
{"date":"2021-01-03 12:10:00","money_spent"。 200, "meatings_eaten":3, "weight":160},
{"date":"2021-01-05 22:07:00","money_spent"。 100, "meatings_eaten":1, "weight":150}]
df = pd.DataFrame.from_dict(rows)
df['date'] = pd.to_datetime(df.date)
df['cum_spent'] = df.money_spent.cumsum()
print(df)
print(pd.cut(df.um_spent, 500))
由于某些原因,我無法讓cut步驟作業。這是我上面的玩具代碼。由于某些原因,標簽不是干凈的[0-500], (500,1000)。老實說,我愿意接受[350,500],(500-800](這就是切割邊緣的實際累積值),但我甚至不能讓它作業,盡管我的做法與檔案中的例子完全一樣。對此有什么幫助嗎?
注意事項和難點:當然,在for回圈中寫這個很容易,只要做一個while cum_spent < 500:。問題是我的實際資料集中有數百萬行,目前我需要20分鐘來處理一個df。
還有一個小問題,即有時行會打破間隔。當這種情況發生時,我希望最后一行被包括在內。這個問題出現在玩具的例子中,第2行實際上以600美元而不是500美元結束。但它是第一行結束于或超過500美元,所以我把它包括在第一個bin中。
uj5u.com熱心網友回復:
自定義的函式來實作帶有重置限制的cumsum
df['new'] = cumli(df['money_spent ($)']. values,500)
out = df.groupby(df.new.iloc[::-1].cumsum()).agg(
date = ('date','first') 。
meals_eaten = (' meals_eaten','mean'),
min_weight = ('weight','min')。
max_weight = ('weight','max')).sort_index(ascending=False)
Out[81]。
日期 meals_eaten min_weight max_weight
新的
1 2021-01-01 3.5 140 170 >。
0 2021-01-03 2.0 150 160
from numba import njit
@njit
def cumli(x, lim)。
total = 0: 總數 = 0.
結果 = []
for i, y in enumerate(x):
Check = 0
總數 = y
if total >= lim:
total = 0
檢查=1
result.append(check)
return result
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/307672.html
標籤:
上一篇:將表格中的HTML資料發送到JSON檔案中(Ajax/Jquery)。
下一篇:<p>我有一個資料框架,比如:</p> <preclass="lang-pys-code-block"><codeclass="
