将列中的值转换为pandas中的列标题

erhoui1w  于 2023-04-04  发布在  其他
关注(0)|答案(3)|浏览(140)

我有以下代码,它将pandas Dataframe 的一列中的值作为新 Dataframe 的列。 Dataframe 第一列中的值将成为新 Dataframe 的索引。
在某种意义上,我想把一个邻接表变成一个邻接矩阵。下面是到目前为止的代码:

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

# 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

这对这个特定示例的作用如下:原始DataFrame

col1 col2  col3
0    a    c     1
1    a    d     2
2    b    c     3
3    b    d     4

转换为新的DataFrame,如下所示

c  d
a  1  2
b  3  4

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

11dmarpk

11dmarpk1#

这看起来像是一个pivot的工作:

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)

产量

col3   
col2     c  d
col1         
a        1  2
b        3  4

如果你不想要MultiIndex列,你可以使用以下命令删除col3

newf.columns = newf.columns.droplevel(0)

这样就能产生

col2  c  d
col1      
a     1  2
b     3  4
vc9ivgsu

vc9ivgsu2#

正如@unutbu提到的,您可以使用pivot重塑 Dataframe 。

res = a.pivot(index='col1', columns='col2', values='col3')

一种更简洁的方法是将列标签解包为args。

res = a.pivot(*a).rename_axis(index=None, columns=None)

另一种方法是显式地构造一个图对象(使用流行的图形库networkx)并构造一个邻接矩阵。对于一个简单的旋转操作来说,这可能太冗长了,但如果给定的数据已经是图形形式,它可能会很有用。

import networkx as nx
g = nx.Graph()
col1 = a['col1'].unique()
col2 = a['col2'].unique()
g.add_weighted_edges_from(list(map(tuple, a.values)))
res = nx.to_pandas_adjacency(g).loc[col1, col2]
kjthegm6

kjthegm63#

另一种方法是将前两列分配为MultiIndex,然后解栈第二列:

df = pd.DataFrame({'col1':['a','a','b','b'], 'col2':['c','d','c','d'], 'col3':[1,2,3,4]}) 
df.set_index(['col1', 'col2']).squeeze().unstack('col2')

导致

col2  c  d
col1      
a     1  2
b     3  4

squeeze()方法将具有单列的DataFrame转换为Series。

相关问题