I have the following code, which takes the values in one column of a pandas dataframe and makes them the columns of a new data frame. The values in the first column of the dataframe become the index of the new dataframe.
In a sense, I want to turn an adjacency list into an adjacency matrix. Here's the code so far:
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
This works for this particular instance:
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
It will fail if the values in col3 are not numbers. My question is, is there a more elegant/robust way of doing this?
columns() to Convert Row to Column Header. You can use df. columns=df. iloc[0] to set the column labels by extracting the first row.
Use list(df) to get the column header from pandas DataFrame. You can also use list(df. columns) to get column names.
This looks like a job for 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)
yields
col3
col2 c d
col1
a 1 2
b 3 4
If you don't want a MultiIndex column, you can drop the col3
using:
newf.columns = newf.columns.droplevel(0)
which would then yield
col2 c d
col1
a 1 2
b 3 4
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With