【问题标题】:Transform a Series in a dataframe (of pandas/Python) where the columns are the levels of the Series在数据帧(pandas/Python)中转换系列,其中列是系列的级别
【发布时间】:2018-02-11 02:27:10
【问题描述】:

我正在使用 pandas,我使用了 groupby:

group = df_crimes_query.groupby(["CrimeDateTime", "WeaponFactor"]).size()
group.head(20)


CrimeDateTime  WeaponFactor
2016-01-01     FIREARM          11
               HANDS            26
               KNIFE             3
               OTHER            11
               UNDEFINED       102
2016-01-02     FIREARM          10
               HANDS            21
               KNIFE             8
               OTHER             6
               UNDEFINED        68
2016-01-03     FIREARM          12
               HANDS            13
               KNIFE             6
               OTHER             5
               UNDEFINED        73
2016-01-04     FIREARM          11
               HANDS            10
               KNIFE             1
               OTHER             3
               UNDEFINED        84
dtype: int64

它的类型是一个系列:

type(group)

pandas.core.series.Series

我想要一个这样的数据框:

CrimeDateTime   FIREARM     HANDS   KNIFE   OTHER   UNDEFINED
2016-01-01      11          26      3       11      102
2016-01-02      10          21      8       6       68
2016-01-03      12          13      6       5       73
2016-01-04      11          10      1       3       84

我想使用这个数据框来绘制五个时间序列,然后为每种类型绘制一个(FIREARM、HANDS 等)。我尝试过,在网上搜索过,但没有成功。

代码在我的 GitHub 中(在名为“测试”的部分中):https://github.com/rmmariano/CAP386_intro_data_science/blob/master/projeto/crimes_baltimore/crimes_baltimore.ipynb

我有其他测试代码,但为了清楚起见,我已经删除了。

有人知道吗?

【问题讨论】:

    标签: python pandas dataframe series data-conversion


    【解决方案1】:

    选项 1
    简单而缓慢

    pd.crosstab(df.CrimeDateTime, df.WeaponFactor)
    
    WeaponFactor   FIREARM  HANDS  KNIFE  OTHER  UNDEFINED
    CrimeDateTime                                         
    2016-01-01          11     26      3     11        102
    2016-01-02          10     21      8      6         68
    2016-01-03          12     13      6      5         73
    2016-01-04          11     10      1      3         84
    

    选项 2
    更快更酷!

    pd.get_dummies(df.CrimeDateTime).T.dot(pd.get_dummies(df.WeaponFactor))
    
                FIREARM  HANDS  KNIFE  OTHER  UNDEFINED
    2016-01-01       11     26      3     11        102
    2016-01-02       10     21      8      6         68
    2016-01-03       12     13      6      5         73
    2016-01-04       11     10      1      3         84
    

    选项 3
    下一级功夫熊猫!

    i, r = pd.factorize(df.CrimeDateTime.values)
    j, c = pd.factorize(df.WeaponFactor.values)
    n, m = r.size, c.size
    b = np.bincount(j + i * m, minlength=n * m).reshape(n, m)
    
    pd.DataFrame(b, r, c)
    
                FIREARM  HANDS  KNIFE  OTHER  UNDEFINED
    2016-01-01       11     26      3     11        102
    2016-01-02       10     21      8      6         68
    2016-01-03       12     13      6      5         73
    2016-01-04       11     10      1      3         84
    

    【讨论】:

    • 哇太棒了。太棒了,先生。
    • 这是功夫熊猫 :)
    • 非常感谢,太棒了:D
    【解决方案2】:

    你会得到想要的结果使用

    df_crimes_query.groupby(["CrimeDateTime", "WeaponFactor"]).size().unstack().reset_index()
    

    【讨论】:

    • 非常感谢 :D
    【解决方案3】:

    您可以使用数据透视表而不是 groupby,即

     df.pivot_table(index='CrimeDateTime',columns='WeaponFactor',values='count')
    

    如果您有这样的数据框,则基于您在笔记本中的代码

    犯罪日期时间武器因素计数 0 2016-01-01 火器 11 1 2016-01-01 手 26 2 2016-01-01 刀 3 3 2016-01-01 其他 11 4 2016-01-01 未定义 102 5 2016-01-02 火器 10 6 2016-01-02 手 21 7 2016-01-02 刀 8 8 2016-01-02 其他 6 9 2016-01-02 未定义 68 10 2016-01-03 火器 12 11 2016-01-03 手13 12 2016-01-03 刀 6 13 2016-01-03 其他 5 14 2016-01-03 未定义 73 15 2016-01-04 火器 11 16 2016-01-04 手10 17 2016-01-04 刀 1 18 2016-01-04 其他 3 19 2016-01-04 未定义 84

    输出:

    df.pivot_table(index='CrimeDateTime',columns='WeaponFactor',values='count')
    
    WeaponFactor FIREARM 手刀 其他未定义 犯罪日期时间 2016-01-01 11 26 3 11 102 2016-01-02 10 21 8 6 68 2016-01-03 12 13 6 5 73 2016-01-04 11 10 1 3 84 在 [595] 中:

    【讨论】:

    • 谢谢巴拉特:D
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2021-03-29
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多