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')
我有这样一个数据框:
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')