【问题标题】:Where am I going wrong when analyzing this data?分析这些数据时我哪里出错了?
【发布时间】:2020-12-07 18:00:30
【问题描述】:

试图找出出勤率的趋势。我将现有的 df 过滤为此,因此我可以一次查看 1 个活动。

+---+-----------+-------+----------+-------+---------+
|   |   Date    |  Org  | Activity | Hours | Weekday |
+---+-----------+-------+----------+-------+---------+
| 0 | 8/3/2020  | Org 1 | Gen Ab   | 10.5  | Monday  |
| 1 | 8/25/2020 | Org 1 | Gen Ab   | 2     | Tuesday |
| 3 | 8/31/2020 | Org 1 | Gen Ab   | 8.5   | Monday  |
| 7 | 8/10/2020 | Org 2 | Gen Ab   | 1     | Monday  |
| 8 | 8/14/2020 | Org 3 | Gen Ab   | 3.5   | Friday  |
+---+-----------+-------+----------+-------+---------+

这段代码:

gen_ab = att_df.loc[att_df['Activity'] == "Gen Ab"]
sum_gen_ab = gen_ab.groupby(['Date', 'Activity']).sum()
sum_gen_ab.head()

返回这个:

+------------+----------+------------+
|            |          |   Hours    |
+------------+----------+------------+
| Date       | Activity |            |
| 06/01/2020 | Gen Ab   | 347.250000 |
| 06/02/2020 | Gen Ab   | 286.266667 |
| 06/03/2020 | Gen Ab   | 169.583333 |
| 06/04/2020 | Gen Ab   | 312.633333 |
| 06/05/2020 | Gen Ab   | 317.566667 |
+------------+----------+------------+

如何使总和列名称为“小时”?当我这样做时,我仍然得到相同的结果:

sum_gen_ab['Hours'] = gen_ab.groupby(['Date', 'Activity']).sum()

我最终想要做的是有一个折线图,它显示了一段时间内活动的总小时数。时间当然是我的 df 中的日期。

plt.plot(sum_gen_ab['Date'], sum_gen_ab['Hours'])
plt.show()

返回 KeyError:日期

【问题讨论】:

    标签: python pandas dataframe matplotlib


    【解决方案1】:

    一旦您使用了groupby(['Date', 'Activity']),日期和活动已被转换为索引,不能用sum_gen_ab['Date'] 引用。

    为避免将它们转换为索引,您可以改用 groupby(['Date', 'Activity'], as_index=False)

    【讨论】:

    • 使用as_index=False 有效。你能告诉我我原来的结果叫什么吗?我的意思是它的标题有“小时”之类的。
    • 我不确定你的意思。您的第一个结果按日期和活动分组,默认情况下会将您分组的列转换为索引。不知道有没有具体的名字。
    【解决方案2】:

    我通常会使用 pandasql 库将我的数据帧操作到不同的数据集中。这允许您使用 SQL 代码操作您的 pandas 数据框。 Pandasql 可以与 pandas 一起使用。

    示例:

    import pandas as pd
    import pandasql as psql
    
    df = "will be your dataset"
    
    
    new_dataset = psql.sqldf('''
    SELECT DATE, ACTIVITY, SUM(HOURS) as SUM_OF_HOURS
    FROM df
    GROUP BY DATE, ACTIVITY''')
    
    new_dataset.head() #Shows the first 5 rows of your dataset
    

    【讨论】:

    • 感谢您分享这个库。我没有将它用于此解决方案,但我现在肯定可以在将来使用它
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2023-03-11
    • 2011-07-21
    • 2011-07-08
    • 2016-08-02
    相关资源
    最近更新 更多