33_Pandas.DataFrame,Series和Python标准列表的相互转换

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之间进行转换的信息,请参见以下文章。

将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之后,也可以通过更新索引和列属性来设置/更改行名/列名。

对于包含数据和标签(行/列名)的列表

从成对的标签和值列表生成pandas.Series。

将其分解为标签数组和值数组,并将其作为参数传递给pandas.Series()。有关使用*和zip()进行处理的详细信息,请参见以下文章。

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()方法指定索引列。

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()方法将其转换为列表,该数组可以使用值属性获取。

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()。

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值