Pandas小白入门(2)---DataFrame的列赋值、多列赋值ValueError: Must have equal len keys and value when setting with a

文章目录

  • 序言及劝退声明
  • 基础讲解
  • 赋值方法
      • List多列赋值
      • DataFrame.apply多列赋值
      • Serise.apply多列赋值

序言及劝退声明

  1. 这里是新手入门教程,讲的啰嗦,高手及受不了的劝退。

  2. Pandas是一个杰作,其创作团队将现实的事物抽象成DataFrame和一系列相关操作,是一个完整的体系。我们学习的pandas的本质其实在学习其体系结构,理顺了作者的思路,就能得心应手。古语曰:学而不思则罔,思而不学则殆;我补一句:学而不习则忘;希望大家在学习Pandas过程中,掌握其底层逻辑,将之纳入自己思维体系。

  3. 一般来说,一款成熟的软件处处透漏着规范,如函数命名、参数位置等等,而且这种规范在软件间大部分情况下是通用的,一通百通,触类旁通,也算是各种隐藏彩蛋,祝各位收货颇丰。

基础讲解

Series 是DataFrame 的单列的数据结构,不仅在概念上,而且在字面上,即DataFrame中的数据实际上作为Series的集合存储在内存中。

类似地:我们需要列表和矩阵,因为矩阵是用列表构建的。单行矩阵,虽然在功能上等同于列表,但如果没有它们组成的列表,仍然无法存在。

它们都有极其相似的 API,但您会发现DataFrame方法总是迎合您拥有多个列的可能性。当然,您始终可以将另一个Series(或等效对象)添加到DataFrame,而将Series添加到另一个Series涉及创建DataFrame。

DataFrame是也可以说是一种多列Serise。

DataFrame是一种定制的结构,其列是Serise对象,所以列赋值的本质是:将新列的值转为Serise对象,传给DataFrame注册为其列。如果你付新值时给的就是Serise对象,就免去转换这步了。

赋值方法

单列赋值是传一下Serise给DataFrame,多列即是传多个Serise。
多列赋值,有三种方法,如下:

List多列赋值

List对象一般下默认转为一个多列Serise对象,但是转化时,只会涉及到第二层,不会涉及多层。如下:

import pandas as pd

df = pd.DataFrame([1,2,3], columns=['a'])

# 多层嵌套的list实例
nested_list = [[[1], [3]], [[22], [33]], [[134], [332]]]

# 赋值 
df.loc[:, 'nested'] = nested_list 
df
	a	nested
0	1	[[1], [3]]
1	2	[[22], [33]]
2	3	[[134], [332]]

DataFrame.apply多列赋值

默认情况DataFrame的apply操作结果为单列Serise对象(其他类似函数也是如此),只能进行单列赋值,需要先变成多列的Serise再赋值,如下:

import pandas as pd
df = pd.DataFrame([1,2,3], columns=['a'])

def double(row):
    e = row.a
    return e, e
# 对应结果1 Serise对象    
df.apply(double, axis=1)
# 多列赋值失败会报错 ValueError: Must have equal len keys and value when setting with an
df.loc[:, ['double_1', "double_2"]] = df.apply(double, axis=1)

# 对应结果2 
df.apply(double, axis=1, result_type='extand')
# 多列赋值成功
df.loc[:, ['double_1', "double_2"]] = df.apply(double, axis=1, result_type='expand')
out1:
0    (1, 1)
1    (2, 2)
2    (3, 3)
dtype: object

out2:  是一个DataFrame  可以多列赋值
	0	1
0	1	1
1	2	2
2	3	3

Serise.apply多列赋值

Serise的apply为Serise对象,无法多列赋值,需要先to_list再赋值。

def double_a(e):
    return e, e

df.loc[:, ['double_1', "double_2"]] = df.a.apply(double_a).to_list()

你可能感兴趣的:(pandas,多列赋值)