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 中缺失的标签在该列中为缺失值。