2017-02-16 48 views
2

我有一個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的/熊貓..

回答

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 
0

最好的辦法就是用熊貓,但你也可以使用一個defaultdict

from collections import defaultdict 

d = """1 A 10 
2 A 20 
1 B 30 
1 C 40 
2 B 50""".split("\n") 
d = [i.split(" ") for i in d] 


# Default value is {1: "0", 2: "0"} 
data = defaultdict(lambda: dict(set([(i[0], "0") for i in d]))) 

# Update values for 1 and 2 
for idx, name, val in d: 
    data[name][idx] = val 

# (Missing the colum ids, but could be added) 
print ["{} {} {}".format(*([k] + v.values())) for k, v in sorted(data.items())] 

>>> ['A 10 20', 'B 30 50', 'C 40 0']