使用系列索引作为列将pandas系列转换为数据框。

62

我有一个Series,像这样:

series = pd.Series({'a': 1, 'b': 2, 'c': 3})

我想将它转换为像这样的数据框:

    a   b   c
0   1   2   3

pd.Series.to_frame()无法正常工作,其结果如下:

    0
a   1
b   2
c   3

我如何将一个带有索引的 Series 转换成 DataFrame,并将其索引作为新 DataFrame 的列名呢?


28
series.to_frame().T - MaxU - stand with Ukraine
可能是重复问题:[Python,将Pandas Series转换为Pandas DataFrame的最佳方法] (https://dev59.com/D18e5IYBdhLWcg3wFnTm) - A.Kot
1
它们是不同的。我的问题集中在使用Series的索引作为列。 - Jzou
5个回答

85

您也可以尝试这样做:

df = DataFrame(series).transpose()

使用transpose()函数,可以交换索引和列。输出如下:

    a   b   c
0   1   2   3

6
如果您没有单独导入DataFrame,您需要这样写:df = pd.DataFrame(series).transpose() - PJay
2
完成。输出正是所需的内容。 - PJay
3
MaxU的评论给出了最佳答案。series.to_frame().T - Jzou
1
警告:这种方法对于小系列非常有效,但如果您使用更长的系列,则复杂性会爆炸。对我而言,它在2755个列的单个系列上运行了21秒。 - Thomas Dussaut

36

您不需要进行转置步骤,只需将您的Series放入列表中并将其传递给DataFrame构造函数:

pd.DataFrame([series])

   a  b  c
0  1  2  3

或者,调用 Series.to_frame,然后使用快捷方式 .T 进行转置:

series.to_frame().T

   a  b  c
0  1  2  3

pd.DataFrame([series])transpose更好。你不必记住什么会移动到行索引,什么会移动到列中。 - Steve Lihn

8

您也可以尝试这个方法:

a = pd.Series.to_frame(series)

a['id'] = list(a.index)

解释:
第一行将Series转换为单列DataFrame。
第二行向该DataFrame添加一个列,该列的值与索引相同。


1
稍微解释一下这个是如何工作的会很有帮助。请记住我们的答案应该是有教育意义的! - Cris Luengo
这个并没有产生预期的结果。 - cs95

7
尝试使用reset_index。它将把您的数据框中的索引转换为一列。
df = series.to_frame().reset_index()

2

This

pd.DataFrame([series]) #method 1

产生的结果与稍有不同

series.to_frame().T #method 2

使用方法1,结果数据框中的元素类型保持不变。例如,series中的int64将保持为int64。
使用方法2,如果series中有对象类型的元素,则结果数据框中的元素将变为对象类型。例如,series中的int64将变为对象类型。
这种差异可能会导致您在后续操作中出现不同的行为,具体取决于pandas的版本。

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