按月分组,但仅获取 Pandas 列中真实值的总计
Group by Month but only grab totals for true values in column with Pandas
我认为这个很简单,但我不知道如何获取我想要的数据。
我在名为 ClosedDate 和 Is_Article_Linked 的数据框中有两个字段。我想按 ClosedDate 的月份对其进行分组,然后仅在 Is_Article_Linked 为真但仍保留总记录时才进行统计。
例如我的代码如下所示
data = [
[ ('ClosedDate', '2021-01-18T12:46:38.000+0000'), ('Is_Article_Linked', True) ],
[ ('ClosedDate', '2021-01-29T12:46:38.000+0000'), ('Is_Article_Linked', True) ],
[ ('ClosedDate', '2021-01-11T12:46:38.000+0000'), ('Is_Article_Linked', False) ],
[ ('ClosedDate', '2021-01-03T12:46:38.000+0000'), ('Is_Article_Linked', False) ],
[ ('ClosedDate', '2021-01-12T12:46:38.000+0000'), ('Is_Article_Linked', True) ]
]
df_ld = pd.DataFrame(data, columns=['ClosedDate', 'Is_Article_Linked'])
# Formatting the date field
df_ld['ClosedDate'] = pd.to_datetime(df_ld['ClosedDate'], format="%y-%m-%d", exact=False)
# Grouping by Month
relevant_links = df_ld.resample('M', on='ClosedDate').count()
# Renaming the index
relevant_links.index = relevant_links.index.rename('Date')
# Outputting to a dictionary
link_accuracy_by_month = relevant_links.reset_index().to_dict('records')
print(link_accuracy_by_month)
这个输出是[{'Date': Timestamp('2021-01-31 00:00:00'), 'ClosedDate': 5, 'Is_Article_Linked': 5}]
我期待看到的是[{'Date': Timestamp('2021-01-31 00:00:00'), 'ClosedDate': 5, 'Is_Article_Linked': 3}]
所以 ClosedDate 是我的总记录,Is_Article_Linked 只是计算 True 的记录。目前它正在计算所有这些,因为我认为它在那里看到了一个值。
有没有办法得到我想要的结果?我相信我的答案在重新采样中,但我只是想不出如何让它只计算真实的。
提前致谢!
假设您提供的数据格式不正确,因此数据框实际看起来像:
ClosedDate Is_Article_Linked
0 2021-01-18 True
1 2021-01-29 True
2 2021-01-11 False
3 2021-01-03 False
4 2021-01-12 True
你可以这样做:
df_ld.resample("M", on = "ClosedDate")\
.agg({"ClosedDate": "count", "Is_Article_Linked":"sum"})\
.rename_axis("Date")\
.reset_index()\
.to_dict("records")
输出
[{'Date': Timestamp('2021-01-31 00:00:00'),
'ClosedDate': 5,
'Is_Article_Linked': 3}]
我认为这个很简单,但我不知道如何获取我想要的数据。
我在名为 ClosedDate 和 Is_Article_Linked 的数据框中有两个字段。我想按 ClosedDate 的月份对其进行分组,然后仅在 Is_Article_Linked 为真但仍保留总记录时才进行统计。
例如我的代码如下所示
data = [
[ ('ClosedDate', '2021-01-18T12:46:38.000+0000'), ('Is_Article_Linked', True) ],
[ ('ClosedDate', '2021-01-29T12:46:38.000+0000'), ('Is_Article_Linked', True) ],
[ ('ClosedDate', '2021-01-11T12:46:38.000+0000'), ('Is_Article_Linked', False) ],
[ ('ClosedDate', '2021-01-03T12:46:38.000+0000'), ('Is_Article_Linked', False) ],
[ ('ClosedDate', '2021-01-12T12:46:38.000+0000'), ('Is_Article_Linked', True) ]
]
df_ld = pd.DataFrame(data, columns=['ClosedDate', 'Is_Article_Linked'])
# Formatting the date field
df_ld['ClosedDate'] = pd.to_datetime(df_ld['ClosedDate'], format="%y-%m-%d", exact=False)
# Grouping by Month
relevant_links = df_ld.resample('M', on='ClosedDate').count()
# Renaming the index
relevant_links.index = relevant_links.index.rename('Date')
# Outputting to a dictionary
link_accuracy_by_month = relevant_links.reset_index().to_dict('records')
print(link_accuracy_by_month)
这个输出是[{'Date': Timestamp('2021-01-31 00:00:00'), 'ClosedDate': 5, 'Is_Article_Linked': 5}]
我期待看到的是[{'Date': Timestamp('2021-01-31 00:00:00'), 'ClosedDate': 5, 'Is_Article_Linked': 3}]
所以 ClosedDate 是我的总记录,Is_Article_Linked 只是计算 True 的记录。目前它正在计算所有这些,因为我认为它在那里看到了一个值。
有没有办法得到我想要的结果?我相信我的答案在重新采样中,但我只是想不出如何让它只计算真实的。
提前致谢!
假设您提供的数据格式不正确,因此数据框实际看起来像:
ClosedDate Is_Article_Linked
0 2021-01-18 True
1 2021-01-29 True
2 2021-01-11 False
3 2021-01-03 False
4 2021-01-12 True
你可以这样做:
df_ld.resample("M", on = "ClosedDate")\
.agg({"ClosedDate": "count", "Is_Article_Linked":"sum"})\
.rename_axis("Date")\
.reset_index()\
.to_dict("records")
输出
[{'Date': Timestamp('2021-01-31 00:00:00'),
'ClosedDate': 5,
'Is_Article_Linked': 3}]