将pandas的Series转换为DataFrame。

173

我有一个Pandas系列sf:

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)

6
在最近版本的pandas中,可以通过单个reset_index调用实现这一点。 - cs95
8个回答

227
不必创建2个临时数据帧,您只需在DataFrame构造函数中使用字典将其作为参数传递即可:
pd.DataFrame({'email':sf.index, 'list':sf.values})

构建一个数据框的方法很多,请参考文档


2
另一个很好的选项是使用concat函数,如果你的系列具有相同的轴,则可以这样做:pd.concat([sf.index, sf.values], axis=1) - Lauren

103

to_frame()

以下是初始 Series,名为 df:

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

我使用 to_frame 将Series转换为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() works! I output this class type <class 'pandas.core.frame.DataFrame'> - Johnny
2
为什么要使用 to_frame().reset_index() 而不是只用 reset_index?你甚至可以只使用 reset_index(name='list') - dumbledad

36

简短回答如下:

myseries.to_frame(name='my_column_name')

或者

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

我需要在seaborn条形图中使用转换后的DataFrame对象,因此我需要重置索引,例如,mydf = myseries.to_frame(name='my_column_name').reset_index()。 - karl li

28

Series.reset_index方法中的name参数

经常会出现这样一种情况,需要将一个 Series 提升为 DataFrame。但是如果该 Series 没有名称,则使用 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 构造器

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

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

   B
A   
a  1
b  2
c  3

我在想为什么有人会使用 to_frame 而不是 reset_index,但是否有时候两者都可以使用呢?这里 - dumbledad
@dumbledad 大多是实用工具。如果您需要带有索引的单列数据框,请使用 to_frame()。如果您需要两列(一列来自系列索引,另一列来自系列值本身),请使用 reset_index()。 - cs95
如果我想使用Series索引作为DataFrame列名(即转置)将Series转换为DataFrame,该怎么办? to_frame似乎没有参数可以实现这一点。谢谢。 - Confounded
请使用 to_frame().T 将其转置。 - cs95

12

超级简单的方法也可以这样

df = pd.DataFrame(series)
它将返回一个只有1列(系列值)和1个索引(0...n)的DF。

1
因此,pd.DataFrame(series, columns=['list']).rename_axis('email') 可能是一个不错的选择。 - masaya

5

Series.to_frame 可以用于将 Series 转换为 DataFrame

# 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

2

这可能被评为一种不符合Python风格的方法,但这将在一行中给出您想要的结果:

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]

0
使用series.to_frame()方法和pd.DataFrame()方法可以将Pandas Series转换为DataFrame。
import pandas
series = pandas.Series([40, 90, 80, 50, 70])
data_frame = series.to_frame()
print(data_frame)

或者使用以下内容:
data_frame = pandas.DataFrame(series)
pd.concat()方法用于在Python中将多个Series转换为单个DataFrame。
data_frame = pandas.concat([series1, series2], axis=1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接