pandas 中的聚合函数缺少数据

Aggragation function in pandas with missing data

我有这样一个数据框:

import pandas as pd
dates = ['2010-01-01', '2010-01-02','2010-01-01','2010-01-01', '2010-01-01','2010-01-01',
        '2010-01-02', '2010-01-02','2010-01-02','2010-01-03', '2010-01-04','2010-01-04', 
        '2010-01-04', '2010-01-01','2010-01-05','2010-01-05', '2010-01-05','2010-01-01']
amounts = [14, 22, 10, 65, 23, 43, 12, 49, 10, 10, 20, 12, 12, 108, 61, 98, 17, 43 ]
types = ['Type1', 'Type1', 'Type1', 'Type2', 'Type1', 'Type3',
        'Type1', 'Type2', 'Type1', 'Type2', 'Type2', 'Type3',
        'Type2', 'Type1', 'Type3', 'Type2', 'Type1', 'Type3']
my_data = {'Date': dates, 'Amount': amounts, 'Type': types}
df = pd.DataFrame(data=my_data)

我想绘制图表(3 个图,每个独特类型 1 个),以获得每种类型每天的平均金额。但是在聚合之后,在那些没有数量的日子里我没有零,所以有 5 个日期,但是由于某些类型中的数据集,没有每种类型的数据,因此无法绘制图表。有办法解决吗?非常感谢!

import matplotlib.pyplot as plt
dates_unique = df["Date"].unique()
types_unique = df["Type"].unique()

for Type in types_unique:
    values = df.loc[df['Type'] == Type].groupby(df.Date).Amount.mean()
    plt.plot_date(dates_unique, values, label=Type)

为了让0(而不是NaN)替换丢失的数据,您应该明确指定它。此外,我建议重新采样到您打算绘制数据的频率,这样完全缺失的日期就不会被“掩盖”,而是以 0 计数出现。

因此,例如:

备选方案 1:

z = df.groupby([
    pd.Grouper(key='Date', freq='D'), 'Type',
])['Amount'].mean().unstack().fillna(0)

备选方案 2:

z = df.pivot_table(
    index='Date', columns='Type', values='Amount',
    fill_value=0).resample('D').sum()

无论哪种情况,z 现在是:

Type            Type1  Type2  Type3
Date                               
2010-01-01  38.750000     65     43
2010-01-02  14.666667     49      0
2010-01-03   0.000000     10      0
2010-01-04   0.000000     16     12
2010-01-05  17.000000     98     61

你可以很容易地绘制它:

z.plot(style='-o')