HOWTO · Pandas

如何将 Pandas Series 转换为 DataFrame

介绍如何将 Pandas Series 转换为 DataFrame。

本页内容

使用 pandas.DataFrame() 或 pandas.Series.to_frame(),可以将单个 Pandas Series 转换为 DataFrame。这两种方法都会把 Series 的索引保留为 DataFrame 的行索引。使用 to_frame(name=...) 为它的值列命名;当旧索引应该变成普通列时,使用 reset_index(name=...)。要将多个 Series 组合为列,使用 pd.concat(..., axis=1)。

以下示例使用这个 Series,它的标签在每次转换中都会成为行索引:

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)

print(df_series)
a    44
b    47
c    64
d    67
e    67
f     9
g    83
h    21
i    36
j    87
dtype: int64

使用 pandas.DataFrame() 将单个 Pandas Series 转换为 DataFrame

将一个 Series 传递给 pandas.DataFrame(),即可创建一个单列 DataFrame。columns 参数设置值列的标签;Series 的索引仍保留为行索引。当你已经在用其他数据构建 DataFrame 时,这个通用构造器非常有用。

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)

print(pd.DataFrame(df_series, columns=["A"]))
    A
a  44
b  47
c  64
d  67
e  67
f   9
g  83
h  21
i  36
j  87

得到的 DataFrame 有一个名为 A 的列,并将 a 到 j 的标签保留为其索引。

当输入已经是 Series 并且你想在创建时指定 DataFrame 选项时,使用该构造器。columns 列表控制输出列的标签;它不会替换 Series 的索引。如果省略 columns,pandas 会在 Series 设置了名称时使用该名称作为值列,否则使用 0。

使用 pandas.Series.to_frame() 将单个 Pandas Series 转换为 DataFrame

当你想把一个 Series 直接变成单列 DataFrame 时,调用 Series.to_frame()。传递 name 可选择值列的标签。该方法保留 Series 的索引,当这些标签用于标识行时非常有用。

对于单个 Series,to_frame(name="A") 是 pandas.DataFrame(series, columns=["A"]) 的简洁替代。选择一个能描述这些值的名称,尤其是在将此 DataFrame 与其他表连接之前。这些转换不会把 Series 索引变成数据列;那种布局请使用 reset_index()。

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)

print(df_series.to_frame(name="A"))
    A
a  44
b  47
c  64
d  67
e  67
f   9
g  83
h  21
i  36
j  87

如果一个 Series 没有名称,to_frame() 会使用 0 作为值列标签。当你还需要把 Series 索引作为一列数据时,使用 reset_index() 方法。给索引轴命名后,第一个输出列就是 index:

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
).rename_axis("index")

print(df_series)
print("\n")
print(df_series.reset_index())
index
a    44
b    47
c    64
d    67
e    67
f     9
g    83
h    21
i    36
j    87
dtype: int64


  index   0
0     a  44
1     b  47
2     c  64
3     d  67
4     e  67
5     f   9
6     g  83
7     h  21
8     i  36
9     j  87

reset_index() 返回一个 DataFrame,原索引位于 index 列,Series 的值位于名为 0 的列中。提供 name 可以直接为值列标注标签:

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
).rename_axis("index")

print(df_series)
print("\n")
print(df_series.reset_index(name="A"))
index
a    44
b    47
c    64
d    67
e    67
f     9
g    83
h    21
i    36
j    87
dtype: int64


  index   A
0     a  44
1     b  47
2     c  64
3     d  67
4     e  67
5     f   9
6     g  83
7     h  21
8     i  36
9     j  87

将多个 Pandas Series 转换为 DataFrame

要将多个 Series 并排放入一个 DataFrame,把它们以 axis=1 传递给 pd.concat()。Pandas 按索引标签对齐值,因此匹配的标签位于同一行。下面的 Series 具有相同的索引,产生三个值列:

import pandas as pd
import numpy as np

np.random.seed(0)

df_series1 = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)
df_series2 = pd.Series(
    np.random.randint(40, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)
df_series3 = pd.Series(
    np.random.randint(80, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)

df_stitched = pd.concat([df_series1, df_series2, df_series3], axis=1)

print(df_stitched)
    0   1   2
a  44  46  97
b  47  64  85
c  64  64  93
d  67  52  88
e  67  98  89
f   9  41  99
g  83  78  96
h  21  79  99
i  36  63  85
j  87  86  95

pd.concat() 函数 使用 axis=1 沿列拼接。它的默认值是 axis=0,即沿行拼接。当索引不同时,按列拼接会按它们的标签对齐;某个 Series 中缺失的标签在该列中为缺失值。