【问题标题】:Transform a 3-column dataframe into a matrix将 3 列数据框转换为矩阵
【发布时间】:2019-01-05 03:41:21
【问题描述】:

我有一个数据框df,例如:

A = [["John", "Sunday", 6], ["John", "Monday", 3], ["John", "Tuesday", 2], ["Mary", "Sunday", 6], ["Mary", "Monday", 4], ["Mary", "Tuesday", 7]] 
df = pandas.DataFrame(A, columns=["names", "dates", "times"])

我想重新调整它,以便我可以创建一个矩阵,而不是三列,其中第一列索引行,第二列索引列,第三列成为矩阵值,类似于:

B = [["John", 6, 3, 2], ["Mary", 6, 4, 7]]
df2 = pandas.DataFrame(B, columns=["names", "Sunday", "Monday", "Tuesday"])

甚至更好:

B = numpy.asarray(B)
B = pandas.DataFrame(B)

如何将 A 转换为 B?

我创建了一个双循环,但在我的情况下,df 非常大,需要很长时间。有没有更好的方法?

这不仅仅是重塑,因为 A 有 18 个值,B 有 8 个

【问题讨论】:

    标签: python pandas dataframe matrix


    【解决方案1】:

    您可以使用pivot_table(),例如:

    In []:
    df.pivot_table(columns='dates', index='names', values='times').reset_index()
    
    Out[]:
    dates names  Monday  Sunday  Tuesday
    0      John       3       6        2
    1      Mary       4       6        7
    

    【讨论】:

    • 我会添加 'times' 来消除多重索引:df.pivot_table(index = 'names',columns = 'dates')['times'].reset_index()
    • 好电话,已更新(使用values='times' - 而不是结果上的索引)。
    【解决方案2】:

    试试:

    df.set_index(['names','dates'])['times'].unstack().reset_index()
    

    输出:

    dates names  Monday  Sunday  Tuesday
    0      John       3       6        2
    1      Mary       4       6        7
    

    或者:

    pd.crosstab(df.names, df.dates, df.times, aggfunc='sum').reset_index()
    

    或者:

    df.groupby(['names','dates']).sum()['times'].unstack().reset_index()   
    

    或者:

    df.pivot('names','dates','times').reset_index()
    

    【讨论】:

    • 一些非常快的计时表明set_index() 方法是我机器上最快的。
    • 两个很好的答案。我和另一个一起去只是因为我必须选择一个,这是第一个评论
    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多