将3列数据帧转换为矩阵

时间:2019-01-05 03:41:21

标签: python pandas dataframe matrix

我有一个数据框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"])

我想重塑形状,以使我可以创建一个矩阵,而不是三列,其中第一列索引行,第二列索引列,第三列成为矩阵值,类似于:< / p>

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?

我创建了一个double for循环,但是对于我来说df非​​常大,需要很长时间。有更好的方法吗?

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

2 个答案:

答案 0 :(得分:4)

尝试:

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()

答案 1 :(得分:4)

您可以使用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