在列中使用列作为行标题和列标题

时间:2017-02-16 10:39:12

标签: 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

实现这一目标的最佳方法是什么?

我当前的解决方案(当我想访问矩阵中的某些内容时使用index_0和index_1):

index_0 = list(set([l.split("\t")[0] for l in csv_file]))
index_1 = list(set([l.split("\t")[1] for l in csv_file]))

m = np.zeros((len(index_0),len(index_1)))

for line in csv_file:
    s = line.split("\t")
    m[index_0.index(s[0]), index_1.index(s[1])] = s[2]

有些东西告诉我使用numpy / pandas有更好的方法来做到这一点..

2 个答案:

答案 0 :(得分:3)

使用pd.pivot_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

或者,使用groupbyunstack

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

答案 1 :(得分:0)

最好的方法是使用pandas但你也可以使用import QCodeDecoder from 'qcode-decoder';

defaultdict