Reputation: 1650
I have two python lists
messages = ['message1', 'message2', 'message3']
labels = [[1,0,1,3,1], [1,1,2,0,3], [0,0,2,1,0]]
I am creating dataFrame which will take messages as first column and labels as cat_1, cat_2, cat_3, cat_4, cat_5 i.e. total 6 columns
I tried
msgs_labels = pd.DataFrame(
{'message': messages,
'cat': labels,
})
but it returns two columns. messages and cat.
Upvotes: 1
Views: 273
Reputation: 862641
If no problem with starting by 0
for new columns names use DataFrame
constructors with join
:
df = pd.DataFrame({'message': messages}).join(pd.DataFrame(labels).add_prefix('cat_'))
print (df)
message cat_0 cat_1 cat_2 cat_3 cat_4
0 message1 1 0 1 3 1
1 message2 1 1 2 0 3
2 message3 0 0 2 1 0
f = lambda x: f'cat_{x + 1}'
df = pd.DataFrame({'message': messages}).join(pd.DataFrame(labels).rename(columns=f))
print (df)
message cat_1 cat_2 cat_3 cat_4 cat_5
0 message1 1 0 1 3 1
1 message2 1 1 2 0 3
2 message3 0 0 2 1 0
Some another ideas:
f = lambda x: f'cat_{x + 1}'
df = (pd.DataFrame(labels,index=messages)
.rename(columns=f)
.rename_axis('messages')
.reset_index())
print (df)
messages cat_1 cat_2 cat_3 cat_4 cat_5
0 message1 1 0 1 3 1
1 message2 1 1 2 0 3
2 message3 0 0 2 1 0
Or a bit crazy:
f = lambda x: f'cat_{x + 1}'
df = (pd.DataFrame(labels,index=pd.Series(messages, name='messages'))
.rename(columns=f)
.reset_index())
Or solution with processing nested lists first:
d = {f'cat_{i + 1}': x for i, x in enumerate(map(list, zip(*labels)))}
d = {**{'message': messages}, **d}
df = pd.DataFrame(d)
print (df)
message cat_1 cat_2 cat_3 cat_4 cat_5
0 message1 1 0 1 3 1
1 message2 1 1 2 0 3
2 message3 0 0 2 1 0
Upvotes: 4
Reputation: 8768
Here is a way:
df = pd.DataFrame({i:j for i,j in zip(messages,labels)}).T.add_prefix('cat_').rename_axis('messages',axis=0).reset_index()
Upvotes: 0
Reputation: 24314
Use:
df=(pd.DataFrame(labels,index=messages)
.reset_index()
.rename(columns=lambda x:'cat_'+str(x+1) if x!='index' else 'messages'))
Output of df
:
messages cat_1 cat_2 cat_3 cat_4 cat_5
0 message1 1 0 1 3 1
1 message2 1 1 2 0 3
2 message3 0 0 2 1 0
Upvotes: 1