想象一下,我有以下資料框:
| 產品 | 第 1 個月 | 第 2 個月 | 第 3 個月 | 第 4 個月 | 全部的 |
|---|---|---|---|---|---|
| 東西A | 5 | 0 | 3 | 3 | 11 |
| 東西B | 10 | 11 | 4 | 8 | 33 |
| 東西C | 0 | 0 | 23 | 30 | 53 |
可以從以下構造:
df = pd.DataFrame({'Product': ['Stuff A', 'Stuff B', 'Stuff C'],
'Month 1': [5, 10, 0],
'Month 2': [0, 11, 0],
'Month 3': [3, 4, 23],
'Month 4': [3, 8, 30],
'Total': [11, 33, 53]})
此資料框顯示每個產品每月銷售的單位數量。
現在,我要做的是創建一個名為“Average”的新列,用于計算每月銷售的平均單位。但是,請注意,在此示例中,Stuff C 在第 1 個月和第 2 個月的值為 0。該產品可能是在第 3 個月推出的,因此它的平均值應僅基于第 3 個月和第 4 個月計算。另請注意,Stuff A 在第 2 個月售出的單位為 0,但這并不意味著該產品是在第 3 個月推出的,因為在第 1 個月售出了 5 個單位。也就是說,它的平均值應基于所有四個月計算。假設提供的資料框可能包含任意數量的月份。
基于這些條件,我提出了以下偽代碼解決方案:
months = ["list of index names of months to calculate"]
x = len(months)
if df["Month 1"] != 0:
df["Average"] = df["Total"] / x
elif df["Month 2"] != 0:
df["Average"] = df["Total"] / x - 1
...
elif df["Month " str(x)] != 0:
df["Average"] = df["Total"] / 1
else:
df["Average"] = 0
這樣一來,平均值將從銷售量不為 0 的第一個月開始計算。但是,我無法將這種邏輯抽象轉換為實際的作業代碼。我無法在保持 elif 條件的同時迭代 len(months)。或者也許有更好、更實用的方法。
我會很感激任何幫助,因為我一直試圖解決這個問題一段時間但沒有成功。
uj5u.com熱心網友回復:
有一種 numpy 方法np.trim_zeros可以修剪前導和/或尾隨零。使用串列推導,您可以遍歷相關的 DataFrame 行,修剪前導零并找到每行剩余內容的平均值。
請注意,由于'Month 1'to'Month 4'是連續的,您可以使用 對它們之間的列進行切片.loc。
import numpy as np
df['Average Sales'] = [np.trim_zeros(row, trim='f').mean() for row in df.loc[:, 'Month 1':'Month 4'].to_numpy()]
輸出:
Product Month 1 Month 2 Month 3 Month 4 Total Average Sales
0 Stuff A 5 0 3 3 11 2.75
1 Stuff B 10 11 4 8 33 8.25
2 Stuff C 0 0 23 30 53 26.50
uj5u.com熱心網友回復:
嘗試:
df = df.set_index(['Product','Total'])
df['Average'] = df.where(df.ne(0).cummax(axis=1)).mean(axis=1)
df_out=df.reset_index()
print(df_out)
輸出:
Product Total Month 1 Month 2 Month 3 Month 4 Average
0 Stuff A 11 5 0 3 3 2.75
1 Stuff B 33 10 11 4 8 8.25
2 Stuff C 53 0 0 23 30 26.50
細節:
將 Product 和 Total 移動到資料幀索引中,這樣我們就可以對資料幀的其余部分進行計算。
首先使用 ne 到零創建一個布爾矩陣。然后,沿行使用 cummax ,這意味著如果有一個非零值,它將保持 True 直到行結束。如果它從零開始,那么 False 將一直保持到第一個非零然后轉向 Turn 并保持 True。
接下來,使用 pd.DataFrame.where 僅選擇該布爾矩陣的值是 Turn,其他值(前導零)將是 NaN,并且不用于計算平均值。
uj5u.com熱心網友回復:
如果您不介意它的記憶體效率有點低,您可以將您的資料框放入一個 numpy 陣列中。Numpy 有一個內置函式可以從陣列中洗掉零,然后你可以使用 mean 函式來計算平均值。它可能看起來像這樣:
import numpy as np
arr = np.array(Stuff_A_DF)
mean = arr[np.nonzero(arr)].mean()
或者,您可以手動將行提取到串列中,然后回圈洗掉零。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408917.html
標籤:
上一篇:將DataFrame附加到DataFrame的numpy陣列
下一篇:從串列和字典的組合創建熊貓資料框
