随时间绘制分类数据计数
Plotting categorical data counts over time
我有一个 DataFrame (df
),其中有一列包含分类数据 (ETH
),带有 DateTimeIndex,我想绘制类别 counts 随着时间的推移(它们按天索引,我理想情况下希望按年绘制它们)。
df = pd.DataFrame({
'County': {
0: 'Bexar',
3: 'Nueces',
4: 'Kerr',
9: 'Harris',
13: 'Hidalgo'},
'Date': {
0: '2012-10-28 00:00:00',
3: '2012-04-16 00:00:00',
4: '2013-09-04 00:00:00',
9: '2013-01-22 00:00:00',
13: '2013-09-26 00:00:00'},
'ETH': {
0: 'Red',
3: 'Green',
4: 'Red',
9: 'Green',
13: 'Red'}
})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True, infer_datetime_format = True)
df['ETH'] = df['ETH'].astype('category')
df = df.set_index('Date')
但是,groupby 或 pivot 的组合都无法提供我想要的任何东西,尽管我知道这应该相当简单。我似乎找不到执行此操作的标准方法 – 求助?
下面的代码将首先按类别 'ETH' 分组,然后遍历每个组。
对于每个组,然后使用 lambda 函数按 DataTimeIndex 年份分组,returns 该年份的行数。然后绘制这些计数。
绘制年份时,它会将其绘制为数字(而不是日期),这就是 x-axis 看起来有点奇怪的原因,您可以将其转换回日期(比如每个日期为 1 月 1 日)年)使它更漂亮。我使用 plt.xlim
和 plt.ylim
稍微调整了限制,使其更容易查看。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
'County': {
0: 'Bexar',
3: 'Nueces',
4: 'Kerr',
9: 'Harris',
13: 'Hidalgo'},
'Date': {
0: '2012-10-28 00:00:00',
3: '2012-04-16 00:00:00',
4: '2013-09-04 00:00:00',
9: '2013-01-22 00:00:00',
13: '2013-09-26 00:00:00'},
'ETH': {
0: 'Red',
3: 'Green',
4: 'Red',
9: 'Green',
13: 'Red'}
})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True, infer_datetime_format = True)
df['ETH'] = df['ETH'].astype('category')
df = df.set_index('Date')
grouped = df.groupby('ETH')
for key, group in grouped:
data = group.groupby(lambda x: x.year).count()
data['ETH'].plot(label=key)
plt.xlim(2011, 2014)
plt.ylim(0,3)
plt.legend()
plt.show()
是的,我意识到颜色与 ETH 变量不匹配,因此 "Green" 绘制为蓝色,"Red" 绘制为绿色 :P
我有一个 DataFrame (df
),其中有一列包含分类数据 (ETH
),带有 DateTimeIndex,我想绘制类别 counts 随着时间的推移(它们按天索引,我理想情况下希望按年绘制它们)。
df = pd.DataFrame({
'County': {
0: 'Bexar',
3: 'Nueces',
4: 'Kerr',
9: 'Harris',
13: 'Hidalgo'},
'Date': {
0: '2012-10-28 00:00:00',
3: '2012-04-16 00:00:00',
4: '2013-09-04 00:00:00',
9: '2013-01-22 00:00:00',
13: '2013-09-26 00:00:00'},
'ETH': {
0: 'Red',
3: 'Green',
4: 'Red',
9: 'Green',
13: 'Red'}
})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True, infer_datetime_format = True)
df['ETH'] = df['ETH'].astype('category')
df = df.set_index('Date')
但是,groupby 或 pivot 的组合都无法提供我想要的任何东西,尽管我知道这应该相当简单。我似乎找不到执行此操作的标准方法 – 求助?
下面的代码将首先按类别 'ETH' 分组,然后遍历每个组。
对于每个组,然后使用 lambda 函数按 DataTimeIndex 年份分组,returns 该年份的行数。然后绘制这些计数。
绘制年份时,它会将其绘制为数字(而不是日期),这就是 x-axis 看起来有点奇怪的原因,您可以将其转换回日期(比如每个日期为 1 月 1 日)年)使它更漂亮。我使用 plt.xlim
和 plt.ylim
稍微调整了限制,使其更容易查看。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
'County': {
0: 'Bexar',
3: 'Nueces',
4: 'Kerr',
9: 'Harris',
13: 'Hidalgo'},
'Date': {
0: '2012-10-28 00:00:00',
3: '2012-04-16 00:00:00',
4: '2013-09-04 00:00:00',
9: '2013-01-22 00:00:00',
13: '2013-09-26 00:00:00'},
'ETH': {
0: 'Red',
3: 'Green',
4: 'Red',
9: 'Green',
13: 'Red'}
})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True, infer_datetime_format = True)
df['ETH'] = df['ETH'].astype('category')
df = df.set_index('Date')
grouped = df.groupby('ETH')
for key, group in grouped:
data = group.groupby(lambda x: x.year).count()
data['ETH'].plot(label=key)
plt.xlim(2011, 2014)
plt.ylim(0,3)
plt.legend()
plt.show()
是的,我意识到颜色与 ETH 变量不匹配,因此 "Green" 绘制为蓝色,"Red" 绘制为绿色 :P