58

I have a pandas series

object x
Ezh2   2
Hmgb   7
Irf1   1

I want to save this as a dataframe with column names Gene and Count respectively I tried

x_df = pd.DataFrame(x,columns = ['Gene','count'])

but it does not work.The final form I want is

Gene Count
Ezh2   2
Hmgb   7
Irf1   1

Can you suggest how to do this

jpp
  • 159,742
  • 34
  • 281
  • 339
Ssank
  • 3,367
  • 7
  • 28
  • 34

3 Answers3

66

You can create a dict and pass this as the data param to the dataframe constructor:

In [235]:

df = pd.DataFrame({'Gene':s.index, 'count':s.values})
df
Out[235]:
   Gene  count
0  Ezh2      2
1  Hmgb      7
2  Irf1      1

Alternatively you can create a df from the series, you need to call reset_index as the index will be used and then rename the columns:

In [237]:

df = pd.DataFrame(s).reset_index()
df.columns = ['Gene', 'count']
df
Out[237]:
   Gene  count
0  Ezh2      2
1  Hmgb      7
2  Irf1      1
EdChum
  • 376,765
  • 198
  • 813
  • 562
62

You can also use the .to_frame() method.

If it is a Series, I assume 'Gene' is already the index, and will remain the index after converting it to a DataFrame. The name argument of .to_frame() will name the column.

x = x.to_frame('count')

If you want them both as columns, you can reset the index:

x = x.to_frame('count').reset_index()
Sealander
  • 3,467
  • 4
  • 19
  • 19
14

If you have a pd.Series object x with index named 'Gene', you can use reset_index and supply the name argument:

df = x.reset_index(name='count')

Here's a demo:

x = pd.Series([2, 7, 1], index=['Ezh2', 'Hmgb', 'Irf1'])
x.index.name = 'Gene'

df = x.reset_index(name='count')

print(df)

   Gene  count
0  Ezh2      2
1  Hmgb      7
2  Irf1      1
jpp
  • 159,742
  • 34
  • 281
  • 339