将列值更改为pandas中的列标题

jun*_*er- 11 python numpy pandas

我有以下代码,它获取pandas数据帧的一列中的值,并使它们成为新数据框的列.数据帧第一列中的值将成为新数据帧的索引.

从某种意义上说,我想将邻接列表转换为邻接矩阵.这是迄今为止的代码:

import pandas as pa
print "Original Data Frame"
# Create a dataframe
oldcols = {'col1':['a','a','b','b'], 'col2':['c','d','c','d'], 'col3':[1,2,3,4]}
a = pa.DataFrame(oldcols)
print a

# The columns of the new data frame will be the values in col2 of the original
newcols = list(set(oldcols['col2']))
rows = list(set(oldcols['col1']))

# Create the new data matrix
data = np.zeros((len(rows), len(newcols)))

# Iterate over each row and fill in the new matrix
for row in zip(a['col1'], a['col2'], a['col3']):
    rowindex = rows.index(row[0])
    colindex = newcols.index(row[1])
    data[rowindex][colindex] = row[2]

newf = pa.DataFrame(data)
newf.columns = newcols
newf.index = rows

print "New data frame"
print newf
Run Code Online (Sandbox Code Playgroud)

这适用于此特定实例:

Original Data Frame
  col1 col2  col3
0    a    c     1
1    a    d     2
2    b    c     3
3    b    d     4
New data frame
   c  d
a  1  2
b  3  4
Run Code Online (Sandbox Code Playgroud)

如果col3中的值不是数字,它将失败.我的问题是,有没有更优雅/更健壮的方式来做到这一点?

unu*_*tbu 15

这看起来像枢轴的工作:

import pandas as pd
oldcols = {'col1':['a','a','b','b'], 'col2':['c','d','c','d'], 'col3':[1,2,3,4]}
a = pd.DataFrame(oldcols)  

newf = a.pivot(index='col1', columns='col2')
print(newf)
Run Code Online (Sandbox Code Playgroud)

产量

      col3   
col2     c  d
col1         
a        1  2
b        3  4
Run Code Online (Sandbox Code Playgroud)

如果您不想要MultiIndex列,可以删除col3使用:

newf.columns = newf.columns.droplevel(0)
Run Code Online (Sandbox Code Playgroud)

然后会屈服

col2  c  d
col1      
a     1  2
b     3  4
Run Code Online (Sandbox Code Playgroud)

  • 别担心 - 它会让你更加欣赏大熊猫! (2认同)