How can I transform multiple columns in a table to list
Question:
How can I transform Tab 1 to Tab2
df = pd.DataFrame({'A': [3, 5], 'B': [4, 6], 'Z': [6, 8]}, index=[1, 100])
I suppose pandas df.melt
might help, but I’m not sure
Answers:
Use DataFrame.melt
with add index values to col1
column, then sorting indices:
df1 = df.melt(ignore_index=False, var_name='col1', value_name='col2')
df1['col1'] += df1.index.astype(str)
df1 = df1.sort_index(ignore_index=True)
print (df1)
col1 col2
0 A1 3
1 B1 4
2 Z1 6
3 A100 5
4 B100 6
5 Z100 8
Or use DataFrame.stack
, join Multiindex values and convert to DataFrame
:
s = df.stack()
s.index = [f'{b}{a}' for a, b in s.index]
df1 = s.rename_axis('col1').reset_index(name='col2')
print (df1)
col1 col2
0 A1 3
1 B1 4
2 Z1 6
3 A100 5
4 B100 6
5 Z100 8
You can flatten your dataframe and manipulate index to get expected output:
out = (df.unstack().sort_index(level=1)
.set_axis([f'{j}{i}' for i in df.index for j in df.columns])
.rename_axis('var').rename('val').reset_index())
Output:
>>> out
var val
0 A1 3
1 B1 4
2 Z1 6
3 A100 5
4 B100 6
5 Z100 8
How can I transform Tab 1 to Tab2
df = pd.DataFrame({'A': [3, 5], 'B': [4, 6], 'Z': [6, 8]}, index=[1, 100])
I suppose pandas df.melt
might help, but I’m not sure
Use DataFrame.melt
with add index values to col1
column, then sorting indices:
df1 = df.melt(ignore_index=False, var_name='col1', value_name='col2')
df1['col1'] += df1.index.astype(str)
df1 = df1.sort_index(ignore_index=True)
print (df1)
col1 col2
0 A1 3
1 B1 4
2 Z1 6
3 A100 5
4 B100 6
5 Z100 8
Or use DataFrame.stack
, join Multiindex values and convert to DataFrame
:
s = df.stack()
s.index = [f'{b}{a}' for a, b in s.index]
df1 = s.rename_axis('col1').reset_index(name='col2')
print (df1)
col1 col2
0 A1 3
1 B1 4
2 Z1 6
3 A100 5
4 B100 6
5 Z100 8
You can flatten your dataframe and manipulate index to get expected output:
out = (df.unstack().sort_index(level=1)
.set_axis([f'{j}{i}' for i in df.index for j in df.columns])
.rename_axis('var').rename('val').reset_index())
Output:
>>> out
var val
0 A1 3
1 B1 4
2 Z1 6
3 A100 5
4 B100 6
5 Z100 8