33_Pandas.DataFrame,Series和Python标准列表的相互转换
pandas.DataFrame,pandas.Series和Python标准list类型列表可以相互转换。
这里,将描述以下内容。
- 将list类型列表转换为pandas.DataFrame,pandas.Series
- 对于仅数据列表
- 对于包含数据和标签(行/列名)的列表
- 将pandas.DataFrame,pandas.Series转换为列表类型列表
- 将数据部分转换为列表类型列表
- 将数据部分和标签(行名/列名)转换为列表类型列表
- 将标签(行名/列名)转换为列表类型列表
为了方便起见,使用了“转换”一词,但实际上,原始对象保持不变,并创建了一种新型的对象。
有关在在pandas.DataFrame,pandas.Series和numPy数组numpy.ndarray之间进行转换的信息,请参见以下文章。
- 31_Pandas.DataFrame,Series和NumPy数组ndarray相互转换
将list类型列表转换为pandas.DataFrame,pandas.Series
对于仅数据列表
如果将列表类型对象传递给每个构造函数pandas.DataFrame()和pandas.Series()的第一个参数,则会基于该列表生成pandas.DataFrame和pandas.Series。
从一维列表生成pandas.Series的示例。也可以使用index参数指定标签。
import pandas as pd
l_1d = [0, 1, 2]
s = pd.Series(l_1d)
print(s)
# 0 0
# 1 1
# 2 2
# dtype: int64
s = pd.Series(l_1d, index=['row1', 'row2', 'row3'])
print(s)
# row1 0
# row2 1
# row3 2
# dtype: int64
从二维数组(列表列表)生成pandas.DataFrame的示例。您还可以使用参数索引指定行名(行标签),并使用参数列指定列名(列标签)。
l_2d = [[0, 1, 2], [3, 4, 5]]
df = pd.DataFrame(l_2d)
print(df)
# 0 1 2
# 0 0 1 2
# 1 3 4 5
df = pd.DataFrame(l_2d,
index=['row1', 'row2'],
columns=['col1', 'col2', 'col3'])
print(df)
# col1 col2 col3
# row1 0 1 2
# row2 3 4 5
在生成pandas.DataFrame和pandas.Series之后,也可以通过更新索引和列属性来设置/更改行名/列名。
- 01_Pandas.DataFrame的行名和列名的修改
对于包含数据和标签(行/列名)的列表
从成对的标签和值列表生成pandas.Series。
将其分解为标签数组和值数组,并将其作为参数传递给pandas.Series()。有关使用*和zip()进行处理的详细信息,请参见以下文章。
- 14_Pandas.DataFrame行和列的转置
l_1d_index = [['Alice', 0], ['Bob', 1], ['Charlie', 2]]
index, value = zip(*l_1d_index)
print(index)
# ('Alice', 'Bob', 'Charlie')
print(value)
# (0, 1, 2)
s_index = pd.Series(value, index=index)
print(s_index)
# Alice 0
# Bob 1
# Charlie 2
# dtype: int64
同样,如果要从标签列表和多个值生成pandas.DataFrame。
可以像上面提到的pandas.Series那样分解数组,但是更容易读取整个数组,然后使用set_index()方法指定索引列。
- 22_Pandas.DataFrame,重置列的行名(set_index)
l_2d_index = [['Alice', 0, 0.0], ['Bob', 1, 0.1], ['Charlie', 2, 0.2]]
df_index = pd.DataFrame(l_2d_index, columns=['name', 'val1', 'val2'])
print(df_index)
# name val1 val2
# 0 Alice 0 0.0
# 1 Bob 1 0.1
# 2 Charlie 2 0.2
df_index_set = df_index.set_index('name')
print(df_index_set)
# val1 val2
# name
# Alice 0 0.0
# Bob 1 0.1
# Charlie 2 0.2
将第一行指定为列,将第二行和后续行指定为第一个参数。
l_2d_index_columns = [['name', 'val1', 'val2'], ['Alice', 0, 0.0], ['Bob', 1, 0.1], ['Charlie', 2, 0.2]]
df_index_columns = pd.DataFrame(l_2d_index_columns[1:], columns=l_2d_index_columns[0])
print(df_index_columns)
# name val1 val2
# 0 Alice 0 0.0
# 1 Bob 1 0.1
# 2 Charlie 2 0.2
df_index_columns_set = df_index_columns.set_index('name')
print(df_index_columns_set)
# val1 val2
# name
# Alice 0 0.0
# Bob 1 0.1
# Charlie 2 0.2
将pandas.DataFrame,pandas.Series转换为列表类型列表
将数据部分转换为列表类型列表
由于没有方法可以将pandas.DataFrame和pandas.Series直接转换为列表类型,因此可以使用Narray的ndarray的ndarray的ndarray的tolist()方法将其转换为列表,该数组可以使用值属性获取。
- 31_Pandas.DataFrame,Series和NumPy数组ndarray相互转换
s = pd.Series([0, 1, 2])
print(s)
# 0 0
# 1 1
# 2 2
# dtype: int64
l_1d = s.values.tolist()
print(l_1d)
# [0, 1, 2]
df = pd.DataFrame([[0, 1, 2], [3, 4, 5]])
print(df)
# 0 1 2
# 0 0 1 2
# 1 3 4 5
l_2d = df.values.tolist()
print(l_2d)
# [[0, 1, 2], [3, 4, 5]]
在值属性中,即使有标签(行名,列名),也将被忽略。
s_index = pd.Series([0, 1, 2], index=['row1', 'row2', 'row3'])
print(s_index)
# row1 0
# row2 1
# row3 2
# dtype: int64
l_1d = s_index.values.tolist()
print(l_1d)
# [0, 1, 2]
df_index = pd.DataFrame([[0, 1, 2], [3, 4, 5]],
index=['row1', 'row2'],
columns=['col1', 'col2', 'col3'])
print(df_index)
# col1 col2 col3
# row1 0 1 2
# row2 3 4 5
l_2d = df_index.values.tolist()
print(l_2d)
# [[0, 1, 2], [3, 4, 5]]
将数据部分和标签(行名/列名)转换为列表类型列表
如果要将标签保留为列表数据,请使用reset_index()方法重置索引列,使其成为数据列。
l_1d_index = s_index.reset_index().values.tolist()
print(l_1d_index)
# [['row1', 0], ['row2', 1], ['row3', 2]]
没有方法可以重置列名(列标签),因此,如果要将行名和列名都保留为pandas.DataFrame中的列表数据,请应用reset_index()方法,然后使用.T和reset_index(reset_index() )应用方法,然后使用.T撤消。
l_2d_index = df_index.reset_index().values.tolist()
print(l_2d_index)
# [['row1', 0, 1, 2], ['row2', 3, 4, 5]]
l_2d_index_columns = df_index.reset_index().T.reset_index().T.values.tolist()
print(l_2d_index_columns)
# [['index', 'col1', 'col2', 'col3'], ['row1', 0, 1, 2], ['row2', 3, 4, 5]]
将标签(行名/列名)转换为列表类型列表
如果仅要将标签转换为列表,请对pandas.Series使用index属性。 index属性是Index类型(在默认序列号的情况下为RangeIndex类型),并且准备了tolist()方法。
print(s_index)
# row1 0
# row2 1
# row3 2
# dtype: int64
print(s_index.index)
# Index(['row1', 'row2', 'row3'], dtype='object')
print(type(s_index.index))
# <class 'pandas.core.indexes.base.Index'>
print(s_index.index.tolist())
# ['row1', 'row2', 'row3']
print(type(s_index.index.tolist()))
# <class 'list'>
同样,对于pandas.DataFrame,行标签(行名)使用index属性,而列标签(列名)使用columns属性。两者都是索引类型。
print(df_index)
# col1 col2 col3
# row1 0 1 2
# row2 3 4 5
print(df_index.index)
# Index(['row1', 'row2'], dtype='object')
print(df_index.index.tolist())
# ['row1', 'row2']
print(df_index.columns)
# Index(['col1', 'col2', 'col3'], dtype='object')
print(df_index.columns.tolist())
# ['col1', 'col2', 'col3']
对于Index类型,可以使用for语句直接获取元素,也可以使用[]指定位置以获取元素。可以使用切片,但不能更改元素。
for i in s_index.index:
print(i, type(i))
# row1 <class 'str'>
# row2 <class 'str'>
# row3 <class 'str'>
print(s_index.index[0])
# row1
print(s_index.index[:2])
# Index(['row1', 'row2'], dtype='object')
# s_index.index[0] = 'ROW1'
# TypeError: Index does not support mutable operations
如果要更改索引和列的元素(行名/列名),请使用rename()。
- 01_Pandas.DataFrame的行名和列名的修改