<pre><code>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')
</code></pre>
<p>每年以字典或数据框的形式返回唯一的ID,以便于查找</p>
<pre><code>d = df.groupby('year')['ID'].apply(set).to_dict() # as dictionary
d['2014'] #returns unique ids for 2014
</code></pre>
<p>下一行每年创建一个具有唯一id的df。如果你只想知道哪些ID是2014的一部分,这是很好的。你知道吗</p>
<pre><code>df_ids = df.groupby('year')['ID'].apply(set).to_frame(name="id_per_year") #as dataframe
</code></pre>
<p>例如,现在可以根据年份进行子集划分,以仅获取2014年的行</p>
<pre><code>df = df.loc[df['year'] == '2014'] # subset for 2014
</code></pre>
<p>如果只想计算2014年的唯一ID,可以按年份分组并使用<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.SeriesGroupBy.nunique.html" rel="nofollow noreferrer">nunique()</a></p>
<pre><code>df_unique = df.groupby('year')['ID'].nunique().to_frame(name="unique_counts")
</code></pre>
<p>下一行创建一个帧,其中包含每年的ID计数</p>
<pre><code>df_counts = df.groupby('year')['ID'].count().to_frame(name="count")
</code></pre>
<p>希望这有帮助</p>
<h2>编辑1:包含聚合以处理评论</h2>
<p>这将生成一个表,其中包含每个ID的计数+其今年的违规总数。你知道吗</p>
<pre><code>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
</code></pre>
<p>如果您喜欢每年唯一ID的数量,可以调整聚合和分组</p>
<pre><code>aggregations = {'ID': pd.Series.nunique, 'violations': 'sum'}
df_agg = df.groupby('year').agg(aggregations)
</code></pre>
<p>你可以做这样的散点图。确保在调色板中为每年添加一种颜色。你知道吗</p>
<pre><code>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')
</code></pre>