Python 将列用作矩阵中的行标题和列标题
我有一个如下的csv文件: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 实现这一目标的最佳方式是什么 我当前的解
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']