我正在構建一個函式,該函式創建一個聚合表,其中包含從 df 開發的某些變數。我認為我做的大部分事情都是正確的,但我很難理解如何計算客戶在前一年購買的不同產品的數量。
我的 df 示例:
df = pd.DataFrame({'year': [2020, 2021, 2021, 2021, 2022],
'id': [3, 1, 1, 2, 1],
'price': [12, 20, 30, 40, 50],
'age': [20, 30, 30, 44, 31],
'product': [book, toy, book, tv, book],
'quantity': [2,1,2,5,9})
到目前為止,這是我的代碼:
df['revenue'] = df.price*df.quantity
df['year'] = pd.DatetimeIndex(df['date']).year
def table(df):
return df.groupby(['year','id'])\
.agg(revenue = ('revenue', 'sum'), age = ('age', 'unique'), product_year_before = ('product', 'nunique'))
它正確計算產品,但它需要是上一年的,而不是當年的。
uj5u.com熱心網友回復:
對于以前year,您可以減去一年MultiIndex:
df1 = table(df)
s = df1['product_year_before'].rename(lambda x: x - 1, level=0)
print (s)
year id
2019 3 1
2020 1 2
2 1
2021 1 1
Name: product_year_before, dtype: int64
一起 - 如果需要DataFrame.join與s系列一起使用的新列:
def table(df):
df1 = (df.groupby(['year','id'])
.agg(revenue = ('revenue', 'sum'),
age = ('age', 'unique'),
product_year_before = ('product', 'nunique')))
s = df1['product_year_before'].rename(lambda x: x - 1, level=0)
return df1.drop('product_year_before', axis=1).join(s)
df1 = table(df)
print (df1)
revenue age product_year_before
year id
2020 3 24 [20] NaN
2021 1 80 [30] 1.0
2 200 [44] NaN
2022 1 450 [31] NaN
與原始列:
def table(df):
df1 = (df.groupby(['year','id'])
.agg(revenue = ('revenue', 'sum'),
age = ('age', 'unique'),
product_year= ('product', 'nunique')))
s = df1['product_year'].rename(lambda x: x - 1, level=0)
return df1.join(s.rename('product_year_before'))
df1 = table(df)
print (df1)
revenue age product_year product_year_before
year id
2020 3 24 [20] 1 NaN
2021 1 80 [30] 2 1.0
2 200 [44] 1 NaN
2022 1 450 [31] 1 NaN
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/515943.html
標籤:Python熊猫功能金融
上一篇:在另一個資料框pandas/python中將行作為新列附加
下一篇:groupby后檢查條件
