将Pandas Series转换为DataFrame


92

我有一个熊猫系列科幻小说:

email
email1@email.com    [1.0, 0.0, 0.0]
email2@email.com    [2.0, 0.0, 0.0]
email3@email.com    [1.0, 0.0, 0.0]
email4@email.com    [4.0, 0.0, 0.0]
email5@email.com    [1.0, 0.0, 3.0]
email6@email.com    [1.0, 5.0, 0.0]

我想将其转换为以下DataFrame:

index | email             | list
_____________________________________________
0     | email1@email.com  | [1.0, 0.0, 0.0]
1     | email2@email.com  | [2.0, 0.0, 0.0]
2     | email3@email.com  | [1.0, 0.0, 0.0]
3     | email4@email.com  | [4.0, 0.0, 0.0]
4     | email5@email.com  | [1.0, 0.0, 3.0]
5     | email6@email.com  | [1.0, 5.0, 0.0]

我找到了一种方法,但是我怀疑这是更有效的方法:

df1 = pd.DataFrame(data=sf.index, columns=['email'])
df2 = pd.DataFrame(data=sf.values, columns=['list'])
df = pd.merge(df1, df2, left_index=True, right_index=True)

4
在较新版本的熊猫中,可以通过一次reset_index调用来实现
cs95

Answers:


136

无需创建2个临时df,您可以使用DataFrame构造函数将它们作为参数传递给dict中:

pd.DataFrame({'email':sf.index, 'list':sf.values})

有很多方法可以构建df,请参阅文档


另一个不错的选择是如果您的系列的轴相同,则进行合并pd.concat([sf.index, sf.values], axis=1)
Lauren

63

to_frame()

从以下系列df开始:

email
email1@email.com    A
email2@email.com    B
email3@email.com    C
dtype: int64

我使用to_frame将系列转换为DataFrame:

df = df.to_frame().reset_index()

    email               0
0   email1@email.com    A
1   email2@email.com    B
2   email3@email.com    C
3   email4@email.com    D

现在,您需要重命名列名称并为索引列命名:

df = df.rename(columns= {0: 'list'})
df.index.name = 'index'

您的DataFrame随时可以进行进一步的分析。

更新:我只是碰到了这个链接,答案与这里的我的令人惊讶。


1
series_obj.to_frame()作品!我输出了此类类型<class 'pandas.core.frame.DataFrame'>
Johnny Zhang,

1
为什么使用to_frame().reset_index()而不是仅仅reset_index?您甚至可以做reset_index(name='list')
dumbledad

17

Series.reset_indexname论点

通常,需要将Series提升为DataFrame的用例会出现。但是,如果该系列没有名称,那么reset_index结果将是:

s = pd.Series([1, 2, 3], index=['a', 'b', 'c']).rename_axis('A')
s

A
a    1
b    2
c    3
dtype: int64

s.reset_index()

   A  0
0  a  1
1  b  2
2  c  3

您在其中看到的列名称是“ 0”。我们可以通过指定name参数来解决此问题。

s.reset_index(name='B')

   A  B
0  a  1
1  b  2
2  c  3

s.reset_index(name='list')

   A  list
0  a     1
1  b     2
2  c     3

Series.to_frame

如果要创建DataFrame而不将索引提升为列,请Series.to_frame按照此答案中的建议使用。这支持名称参数。

s.to_frame(name='B')

   B
A   
a  1
b  2
c  3

pd.DataFrame 建设者

您还可以执行与Series.to_frame指定columns参数相同的操作:

pd.DataFrame(s, columns=['B'])

   B
A   
a  1
b  2
c  3

我想知道为什么可以使用to_frame而不是reset_index,但是是否有充分的理由同时使用两者呢?在这里
dumbledad

@dumbledad主要是实用程序。如果要使用带有索引的单个col数据框,请使用to_frame()。如果需要两列(一个来自系列索引,另一个来自系列值本身),请使用reset_index()。
cs95

如果我想将Seires索引用作DataFrame列名称(即转置),将Series转换为DataFrame,该怎么办?to_frame似乎没有理由这样做。谢谢。
混淆

@Confounded使用to_frame()。T进行转置
cs95,

17

一线答案是

myseries.to_frame(name='my_column_name')

要么

myseries.reset_index(drop=True, inplace=True)  # As needed

4

Series.to_frame可用于将转换SeriesDataFrame

# The provided name (columnName) will substitute the series name
df = series.to_frame('columnName')

例如,

s = pd.Series(["a", "b", "c"], name="vals")
df = s.to_frame('newCol')
print(df)

   newCol
0    a
1    b
2    c

1

可能被评级为执行此操作的非pythonic方式,但这将在一行中给出您想要的结果:

new_df = pd.DataFrame(zip(email,list))

结果:

               email               list
0   email1@email.com    [1.0, 0.0, 0.0]
1   email2@email.com    [2.0, 0.0, 0.0]
2   email3@email.com    [1.0, 0.0, 0.0]
3   email4@email.com    [4.0, 0.0, 3.0]
4   email5@email.com    [1.0, 5.0, 0.0]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.