使用python和matplotlib绘制直方图

2024-10-16 20:44:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从2014年到2018年的样本数据,需要绘制一个直方图来找出异常值。但首先,我需要弄清楚2014年、2015年……2018年的162个唯一ID中有多少个,然后再画出来。I first store data_2014=数据['日期']。日期年==2014表示2014年,但如何查找162个唯一ID中的哪一个发生在2014年?非常感谢!你知道吗

|        ID     |    DATE      | VIOLATIONS |
| 0      CHI065 |  2014-07-08  |        65  |
| 1      CHI010 |  2014-07-16  |        56  |
| 2      CHI069 |  2014-07-08  |        10  |
| 3      CHI010 |  2014-07-26  |       101  |
| 4      CHI010 |  2014-07-27  |        92  |
| 5      CHI068 |  2014-08-03  |        20  |
| 17049  CHI040 |   2018-12-22 |        15  |
| 170496 CHI168 |  2018-12-23  |        16  |
| 170497 CHI103 |  2018-12-23  |         8  |

Tags: 数据storeiddatadate绘制直方图first
2条回答
import pandas as pd

df = pd.DataFrame({'date': {0: '26-1-2014', 1: '26-1-2014', 2:'26-1-2015', 3:'30-1-2014'}, 
                  'ID': {0:"id12", 1: "id13", 2: "id14", 3: "id12"}, 'violations': {0: 34, 1:3, 2: 45, 3: 15} } )
df['year'] = pd.to_datetime(df.date).dt.strftime('%Y')

每年以字典或数据框的形式返回唯一的ID,以便于查找

d = df.groupby('year')['ID'].apply(set).to_dict() # as dictionary
d['2014'] #returns unique ids for 2014

下一行每年创建一个具有唯一id的df。如果你只想知道哪些ID是2014的一部分,这是很好的。你知道吗

df_ids = df.groupby('year')['ID'].apply(set).to_frame(name="id_per_year") #as dataframe

例如,现在可以根据年份进行子集划分,以仅获取2014年的行

df = df.loc[df['year'] == '2014'] # subset for 2014

如果只想计算2014年的唯一ID,可以按年份分组并使用nunique()

df_unique = df.groupby('year')['ID'].nunique().to_frame(name="unique_counts")

下一行创建一个帧,其中包含每年的ID计数

df_counts = df.groupby('year')['ID'].count().to_frame(name="count")

希望这有帮助

编辑1:包含聚合以处理评论

这将生成一个表,其中包含每个ID的计数+其今年的违规总数。你知道吗

import pandas as pd

df = pd.DataFrame({'date': {0: '26-1-2014', 1: '26-1-2014', 2:'26-1-2015', 3:'30-1-2014'}, 
                  'ID': {0:"id12", 1: "id13", 2: "id14", 3: "id12"}, 'violations': {0: 34, 1:3, 2: 45, 3: 15} } )
df['year'] = pd.to_datetime(df.date).dt.strftime('%Y')

aggregations = {'ID': 'count', 'violations': 'sum'}

df_agg = df.groupby(['year', 'ID']).agg(aggregations)

corr = df_agg.groupby('year')[['ID', 'violations']].corr() #optional

如果您喜欢每年唯一ID的数量,可以调整聚合和分组

aggregations = {'ID': pd.Series.nunique, 'violations': 'sum'}
df_agg = df.groupby('year').agg(aggregations)

你可以做这样的散点图。确保在调色板中为每年添加一种颜色。你知道吗

import seaborn as sns
sns.scatterplot(df_agg["ID"], df_agg["violations"],hue=df_agg.index.get_level_values("year"),palette=["r", "b"], legend='full')

您可以使用此answer中的示例在新列中获取年份

df['year'] = pd.DatetimeIndex(df['DATE']).year

或者

df['year'] = df['ArrivalDate'].dt.year

然后使用groupby和agg获得每年的计数:

counts = df.groupby('year').agg('count')

所以每年

相关问题 更多 >