Python 将列用作矩阵中的行标题和列标题

Python 将列用作矩阵中的行标题和列标题,python,pandas,numpy,Python,Pandas,Numpy,我有一个如下的csv文件: 1 A 10 2 A 20 1 B 30 1 C 40 2 B 50 1 2 A 10 20 B 30 50 C 40 0 我想这样组织我的矩阵: 1 A 10 2 A 20 1 B 30 1 C 40 2 B 50 1 2 A 10 20 B 30 50 C 40 0 实现这一目标的最佳方式是什么 我当前的解

我有一个如下的csv文件:

1   A   10
2   A   20
1   B   30
1   C   40
2   B   50
    1   2

A   10  20  
B   30  50
C   40  0
我想这样组织我的矩阵:

1   A   10
2   A   20
1   B   30
1   C   40
2   B   50
    1   2

A   10  20  
B   30  50
C   40  0
实现这一目标的最佳方式是什么

我当前的解决方案(当我想访问矩阵中的某些内容时,使用索引0和索引1):


有些事情告诉我,有一种更有效的方法可以使用numpy/pandas实现这一点。

使用
pd.pivot\u table

In [913]: df.pivot_table(index='col2', columns='col1', 
                         values='col3', aggfunc='sum', fill_value=0)
Out[913]:
col1   1   2
col2
A     10  20
B     30  50
C     40   0
或者,使用
pd.crosstab

In [921]: pd.crosstab(index=df['col2'], columns=df['col1'], values=df['col3'], 
     ...:             aggfunc='sum').fillna(0)
Out[921]:
col1     1     2
col2
A     10.0  20.0
B     30.0  50.0
C     40.0   0.0
或者,使用
groupby
unstack

In [926]: df.groupby(['col2', 'col1']).sum().unstack(fill_value=0)
Out[926]:
     col3
col1    1   2
col2
A      10  20
B      30  50
C      40   0

最好的方法是使用pandas,但也可以使用
defaultdict

从集合导入defaultdict
d=“”1 A 10
2 A 20
1 B 30
1 C 40
2 B 50“。拆分(“\n”)
d=[i.split(“”)表示d中的i]
#默认值为{1:“0”,2:“0”}
data=defaultdict(lambda:dict(设置([(i[0],“0”)表示d中的i]))
#更新1和2的值
对于idx,d中的名称和val:
数据[name][idx]=val
#(缺少列ID,但可以添加)
按排序(data.items())为k,v打印[“{}{}{}”.format(*([k]+v.values())]
>>>[A 10 20',B 30 50',C 40 0']