5e

更新时间:2023-04-19 14:59:22 阅读: 评论:0

笔记本换内存条-松下问童子下一句


2023年4月19日发(作者:馅)

pandas中的那些让⼈有点懵逼的异常(坑向)

楔⼦

pandas是⼀个很强⼤的库,但是在使⽤的过程中难免会遇见各种奇葩的异常,⽽这些异常却⼜很难让⼈定位到底是哪⼀步出

了问题。下⾯就来看看pandas中的⼀些令⼈感到费解的异常吧,看看你有没有遇到过,如果没有的话,那么说明你pandas

可能⽤的不够多哦。

ヽ( ̄ ̄( ̄ ̄〃)ゝ⼀起来看看

gWithCopyWarning:

当然这不是个异常,⽽是⼀个警告,这个警告相信⼤多数⼈都遇到过,尤其是初学pandas的时候。这个警告具体内容如下:

1SettingWithCopyWarning:

2AvalueistryingtobetonacopyofaslicefromaDataFrame.

[row_indexer,col_indexer]=valueinstead

4

5Seethecaveatsinthedocumentation:/pandas-docs/......

我们来复现⼀下这个警告:

1importpandasaspd

2

3df=ame({"name":["mashiro","koishi","satori","kurisu"],

4"age":[17,16,17,19],

5"adult":[None,None,None,None]})

6

7print(df)

8"""

9nameageadult

100mashiro17None

111koishi16None

122satori17None

133kurisu19None

14"""

15#我现在想将df中age>18对应的audit设置为True

16

17#但是会发现没有效果,并且SettingWithCopyWarning就是由这⼀⾏代码引发的

18df[df["age"]>16]["adult"]=True

19print(df)

20"""

21nameageadult

220mashiro17None

231koishi16None

242satori17None

253kurisu19None

26"""

为什么会出现这个原因呢?因为df[df["age"]>16]得到的是原始DataFrame的⼀份拷贝,因此其相应的操作不会影响原来的

DataFrame。尽管这样的操作是允许的,但是却⽆法得到正确的结果,因此pandas弹出了⼀个警告。

1#真正的做法是使⽤loc或者iloc

[df["age"]>18,"adult"]=True

3print(df)

4"""

5nameageadult

60mashiro17None

71koishi16None

82satori17None

93kurisu19None

10"""

ror:'Series'objectsaremutable,thustheycannotbehashed

这个异常实际上⽐较常见了,说⽩了就是你不⼩⼼把loc或者iloc给丢掉了,我们还⽤上⾯的例⼦

1try:

2df[df["age"]>18,"adult"]=True

3exceptExceptiona:

4print(e)#'Series'objectsaremutable,thustheycannotbehashed

rror:,(),(),()()

我们知道,像ifa:,nota之类的,本质上都是调⽤a的__bool__⽅法,可以理解为bool(a)

1classA:

2

3def__bool__(lf):

4returnTrue

5

6

7ifA():

8print("123")

9el:

10print("456")

11print(bool(A()))

12"""

13123

14True

15"""

16

17

18#由于A的__bool__返回了True,所以bool(A())为True

19#我们将其改为Fal

20A.__bool__=lambdalf:Fal

21print(bool(A()))#Fal

但是对于⼀个Series或者numpy中的array不可以这么做。

1importpandasaspd

2

3s=([True,Fal])

4try:

5bool(s)

6exceptExceptiona:

7print(e)#,(),(),()().

8

9try:

1

0

:#得到⼀个numpy中的array

1

1

pass

1

2

exceptExceptiona:

1

3

print(e)#()()

1

4

1

5

1

6

"""

1

7

对于⼀个Series对象来说,不可以使⽤其布尔值,应当使⽤()、()或者(s)、(s)

1

8

1

9

但是对于numpy中的array来讲,如果这个array⾥⾯的元素不⽌⼀个,那么也不可以使⽤其布尔值,但如果该array中只有⼀个元素的话

是个例外

2

0

此时:([123])等价于if123

2

1

2

2

因此如果使⽤其布尔值的话,最好使⽤()或者()将⼀个序列变成单个布尔值

2

3

"""

2

4

2

5

#但如果只是希望像列表⼀样,如果该Series对象⾥⾯有值就是真,否则就是假

2

6

#那么建议通过iflen(s):这种⽅式来判断

2

7

#同理DataFrame也是如此

4.布尔你咋啦?

我们知道,可以对两个类型为bool的Series对象进⾏与、或、⾮等操作,但是结果真的⼀定是我们想要的吗?

1importpandasaspd

2

3s1=([True,True,True])

4s2=([True,Fal,True],index=[1,2,3])

5

6print(s1&s2)

7"""

80Fal

91True

102Fal

113Fal

12dtype:bool

13"""

14#我们看到与运算之后,长度变成了4,究其原因就是两个Series索引不同造成的

15#⽽Series的很多操作都是基于索引进⾏对齐的,并不是简简单单地按照顺序

16#但如果对应的索引⼀样的话,那么也可以认为就是按照顺序从上到下

17#但如果索引不⼀样的话,pandas是怎么做的呢?答案是使⽤reindex

18

19#⾸先找到两个Series对象中出现的所有不重复索引

20index=|

21print(index)#Int64Index([0,1,2,3],dtype='int64')

22

23#使⽤reindex进⾏对齐,不存在的使⽤NaN代替,当然我们也可以指定fill_value进⾏填充

24#⽐如fill_value=Fal

25print(x(index))

26"""

270True

281True

292True

303NaN

31dtype:object

32"""

33print(x(index))

34"""

350NaN

361True

372Fal

383True

39dtype:object

40"""

41

42#所以s1&s2最终等价于x(index)&x(index)

43#因此即使两者个数不同也是没有问题的

44s1=([True,True,True,True])

45s2=([True,True,True],index=[1,2,3])

46print(s1&s2)

47"""

480Fal

491True

502True

513True

52dtype:bool

53"""

总之pandas中很多操作,并不是我们想的那么简单,pandas的Series和DataFrame都具备索引的概念,通过索引来定位速度

是⾮常快的。但是不注意就会造成陷阱,究其原因就是很多操作在定位的时候是基于索引来定位的,并不是简单的按照顺

序。⽐如:s1&s2,指的是s1和s2中相同索引对应的元素进⾏与运算,当然如果有对应不上的,事先已经通过reindex处理

好了。

当然,如果我们不希望考虑索引的话,只是单纯的希望按照顺序进⾏位运算,该怎么做呢?办法有两种

1importpandasaspd

2

3s1=([True,True,True])

4s2=([True,Fal,True],index=[1,2,3])

5

6#对Series使⽤ret_index即可,当然要指定drop=True,否则就变成DataFrame了

7#⼀旦ret_index之后两者索引从头到尾就是⼀致的了

8print(_index(drop=True)&_index(drop=True))

9"""

100True

111Fal

122True

13dtype:bool

14"""

15

16#或者转成numpy中的array

17#我们知道Series等价于numpy中的n个array,分别存放索引、值等等

18#我们调⽤即可拿到索引,即可拿到值

19print(&s2)

20"""

211True

222Fal

233True

24dtype:bool

25"""

26#如果其中是⼀个array的话,那么它没有索引的概念,索引此时也是单纯的⼀个⼀个对应进⾏运算

27#当然得到的结果也是⼀个Series,索引和运算的Series的索引保持⼀致

28

29#或者都转成array

30print(&)#[TrueFalTrue]

31

32#但是注意:如果其中⼀⽅转成了array,那么此时就要求两个序列的布尔元素个数是必须相等的

33#此时就不会再通过reindex进⾏扩展了,因为array没有reindex

34#当然都转成array就更不⽤说了

我们说了很多关于索引的话题,之所以强调这⼀点,是因为这⾥⾯存在⼀个坑点。我们知道对于DataFrame对象来说,通过

df[xxx]可以取得相应的数据,xxx的⾝份不同,取得的数据也不同

如果xxx是⼀个标量,那么df[xxx]表⽰获取df的某⼀列,得到⼀个Series对象

如果xxx是⼀个列表或者numpy的narray,那么xxx⾥⾯可以是该DataFrame对象的列名,表⽰获取指定的多个列,得到

DataFrame对象

如果xxx是⼀个列表或者numpy的narray,那么这个xxx⾥⾯还可以是布尔值,并且其长度要和该DataFrame对象的⾏数相

等,表⽰获取对应的⾏数。对应为True的保留,为Fal的不要,也是得到DataFrame对象

举个栗⼦

1importpandasaspd

2

3df=ame({"a":[1,2,3],"b":[11,22,33]})

4

5

6#只有第⼀个为True,因此被保留了下来

7print(df[[True,Fal,Fal]])

8"""

9ab

100111

11"""

12

13try:

14#但此时指定的4个布尔值

15print(df[[True,Fal,Fal,Fal]])

16exceptExceptiona:

17print(e)#Itemwronglength4insteadof3.

18"""

19告诉我们个数不匹配

20所以上⾯之所以说了索引,就是因为在做运算的的时候可能导致布尔值的个数最终和DataFrame的⾏数不匹配

21从⽽在筛选指定记录的时候发⽣报错

22"""

如果是Series也是可以的

1importpandasaspd

2

3df=ame({"a":[1,2,3],"b":[11,22,33]})

4

5flag=([True,Fal,Fal])

6print(df[flag])

7"""

8ab

90111

10"""

11#当然⾥⾯也可以是⼀个Series,当然这个Series不仅个数要匹配,索引也要匹配

12#我们知道df的索引是012,那么该flag的索引也必须是012给未来的自己写一封信 (但是顺序不要求)

=[1,2,3]

14try:

15df[flag]

16exceptExceptiona:

17print(e)

18#UnalignablebooleanSeriesprovidedasindexer(indexofthebooleanSeriesandoftheindexedobjectdonotmatch).

19

20

21"""

22我们看到报了上⾯那个错误,意思我们传递了bool类型的Series对象,但是其索引和DataFrame的索引不匹配

23"""

24

25#我们再改⼀下

=[1,2,0]

27print(flag)

28"""

291True

302Fal

310Fal

32dtype:bool

33"""

34print(df[flag])

35"""

36ab

371222

38"""

39#我们看到此时布尔值True对应的索引为1,那么筛选的就不再是df中的第⼀⾏了

40#⽽是索引为1的⾏,也就是第⼆⾏。

41#因此尽管对Series的索引的值有要求,但是对顺序却并没有要求

42#所以这种情况下,筛选出来的数据可能就和我们想象的不⼀样,明明第⼀个是True,为啥却把DataFrame的第⼆⾏选出来了

43#原因就是,虽然第⼀个是True,但是它对应的索引是1

因此索引这个东西在定位数据的时候,会⾮常⽅便,因为我们可以直接通过索引去定位。但是在⼀些操作⽅⾯,我们关⼼的

并不是它的索引,⽽是它的值,⽐如:s1&s2,或者df[flag],这个时候我们只是对内部的布尔值感兴趣,那么直接把s1、

s2、flag这些变成numpy中的array之后,再去传递即可。此时就⽆需考虑索引啥的了。

5.怎么给DataFrame添加字段呢?

给⼀个DataFrame添加⼀个字段,并附上初始值有以下⼏种⽅式。

1importpandasaspd

2

3df=ame({"a":[1,2,3],"b":[11,22,33]})

4

5#可以给⼀个标量,然后会⾃动进⾏⼴播

6df["c"]="xx"

7

8#也可以是⼀个列表,如果⾥⾯只有⼀个元素,那么和标量是等价的

9df["d"]="yy"

10print(df)

11"""

12abcd

130111xxyy

141222xxyy

152333xxyy

16"""

17

18#如果是列表⾥⾯有多个值,那么个数必须和df的⾏数匹配

19#否则会报出ValueError:Lengthofvaluesdoesnotmatchlengthofindex

20df["e"]=["x","y","z"]

21print(df)

22"""

23abcde

240111xxyyx

251222xxyyy

262333xxyyz

27"""

28

29#还有⼀种办法是通过,这种办法可以同时创建多个列

30df=df[["a","b"]]

31df=(

32#这⾥指定接收⼀个参数的函数,这个参数就是整个df

33#通过关键字参数,那么参数名就是列名

34c=lambdax:x["a"]+1,

35d=lambdax:x["b"]*2,

36e=lambdax:["i","j","k"],

37f=lambdax:"哼哼"

38)

39print(df)

40"""

41abcdef

420111222i哼哼

431222344j哼哼

442333466k哼哼

45"""

给⼀个DataFrame添加⼀个字段,同样存在索引的陷阱

1importpandasaspd

2

3df=ame({"a":[1,2,3],"b":[11,22,33]})

4

5df["c"]=(["x","y","z"],index=[0,2,3])

6print(df)

7"""

8abc

90111x

101222NaN

112333y

12"""

原因⽆需我再多解释,总⽽⾔之就是我们刚才说的那样,如果我们只关⼼值,不关⼼索引,那么就不要传递Series对象,直

接传递numpy中的array或者列表即可,这样我们就根本不需要考虑索引对齐的问题。

传递⼀个⼀维序列是可以的,那么传递⼀个DataFrame对象会浓妆淡抹 如何呢?

1importpandasaspd

2

3df=ame({"a":[1,2,3],"b":[11,22,33]})

4df1=ame({"x":["aa",22,None],"y":[">>","^^","YY"]})

5

6try:

7#因为df1有两个字段,这⾥我们只指定了⼀个

8df["c"]=df1

9exceptExceptiona:

10print(e)#Wrongnumberofitemspasd2,placementimplies1

11

12#我们知道df1["x"]是个Series,所以df["c"]=df1["x"]肯定没有错

13#但是df["c"]景物描写200字 =df1[["x"]]呢?df1[["x"]]显然是个DataFrame

14df["c"]=df1[["x"]]

15print(df)

16"""

17abc

180111aa

19122222

202333None

21"""

22#可以看到,如果DataFrame只有⼀个字段,那么等价于Series

23

24

25#最后,df["xx"]=xx这种⽅式,在xx是⼀维序列的前提下完全等价于[:,"xx"]=xx

26#但如果xx是⼀个DataFrame的话就不⼀样了

27df=ame({"a":[1,2,3],"b":[11,22,33]})

28df1=ame({"x":["aa",22,None],"y":[">>","^^","YY"]})

29

[:,"c"]=df1

31print(df)

32"""

33abc

340111NaN

351222NaN

362333NaN

37"""

38#我们惊奇地发现它居然没有报错,但结果却是NaN

39#我们rename⼀下

40df1=(columns={"y":"c"})

[:,"c"]=df1

42print(df)

43"""

44abc

450111>>

461222^^

472333YY

48"""

49#因此我们发现在使⽤[:,"xx"]=df1的时候

50#会⾃动去找df1中列名为"xx"的列,如果找不到就为NaN

如果给DataFrame添加多个字段的话,除了assign之外,还有什么办法呢?

1importpandasaspd

2

3df=ame({"a":[酒精灯怎么灭 1,2,3],"b":[11,22,33]})

4df1=ame({"x":["aa",22,None],"y":[">>","^^","YY"]})

5

6df[["c","d"]]=df1

7print(df)

8"""

9abcd

100111aa>>

11122222^^

122333NoneYY

13"""

14#这⾥可以要求列名不⼀致,但是个数必须要匹配

15

16

17df=ame({"a":[1,2,3],"b":[11,22,33]})

18df1=ame({"x":["aa",22,None],"y":[">>","^^","YY"]})

19#但是对于loc来说,⽆法添加多个字段

20#添加⼀个字段是可以的,但是多个不⾏

21try:

[:,["c","d"]]=df1

23exceptExceptiona:

24#loc表⽰筛选,⽽df的列中没有"c"和"d"

25#即使是[:,["c"]]也不可以,但是[:,"c"]是可以的

26print(e)#"Noneof[Index(['c','d'],dtype='object')]areinthe[columns]"

27

28#所以df[["c","d"]]=df1,如果列c、d不存在,那么会⾃动添加

29#但是对于[:,["c","d"]]=df1,如果c、d不存在,则报错,注意:不是都不存在,⽽是只要有⼀个不存在就报错

30#如果是指定了不存在的索引,暂时不会报错,⽽是弹出⼀个警告

31print([[1,11]])

32"""

33ab

3412.022.0

3511NaNNaN

36"""

37#我们看到指定了不存在的索引,那么⾃动为NaN

38#但同时会抛出⼀个FutureWarning:

39"""

[]withanymissinglabelwillrai

41KeyErrorinthefuture,x()asanalternative.

42"""

43#意思是让我们先reindex⼀下

所以如果想添加多个字段,可以直接通过df[["c1","c2"]]=df1的⽅式,但是注意:右边写的df1,所以右边需要也是⼀个

DataFrame,并且两者列数相等

1importpandasaspd

2

3df=ame({"a":[1,2,3],"b":[11,22,33]})

4df1=ame({"x":["aa",22,None],"y":[">>","^^","YY"]})

5

6#这⾥我们本意是想创建两个字段,值都为None

7#但是很遗憾这样不可以

8try:

9#右边的值也古代节日 需要是⼀个DataFrame

10df[["c","d"]]=None

11exceptExceptiona:

12#我们看到这⾥也同样报出了相应的错误

13#因此只有当右边的值是DataFrame的时候,df[["c","d"]]才能具备创建新字段的能⼒

14print(e)#"Noneof[Index(['c','d'],dtype='object')]areinthe[columns]"

15

16#如果想创建多个新字段,并且还希望通过⼴播的⽅式赋上同⼀个值,那么上⾯做法是⾏不通的

17#解决办法是⼀个字段⼀个字段的创建,这样百分之百是没有任何问题的,既可以df["c"]也可以[:,"c"]

18#但是也可以通过我们之前说的assign

19df=(

20c=lambdax:None,

21d=lambdax:None,

22)

23print(df)

24"""

25abcd

260111NoneNone

271222NoneNone

282333NoneNone

29"""

30

31#除此之外,还有⼀个inrt⽅法

32#这个⽅法接收:插⼊的位置、列名、值

33#⽐如我想在列c的后⾯插⼊⼀个新列age,值全部是18,该怎么做呢?

(_loc("c")+1,"age",18)

35print(df)

36"""

37abcaged

380111None18None

391222None18None

402333None18None

41"""

42#我们看到inrt这个⽅法是在本地进⾏操作的

43#关键是第⼀个参数,我们希望插在c的后⾯,那么就必须获取c所在的索引,当然也可以直接数出来

44#通过_loc即可获取,然后再加上1即可

rror:cannotcomputeisinwithaduplicateaxis.

这个错误当初也是把我搞懵逼了半天,在复现这个异常之前,我们先来聊聊⾮常常⽤的isin

isin我们⼀般是对Series对象使⽤,判断这个序列中每⼀个元素是不是在另⼀个序列⾥⾯,下⾯举例说明:

1importpandasaspd

2

3s=(["a","b","c","d"])

4print((["a","c","e"]))

5"""

60True

71Fal

82True

93Fal

10dtype:bool

11"""

这个⽅法是我们经常使⽤的,但是你对DataFrame使⽤过isin吗?我们有时候需要判断两个序列,看这两个序列中的值是否

在另外两个序列⾥⾯。

1importpandasaspd

2

3df1=ame({"x":["a","b","c","d"健康小妙招 ],"y":[1,2,3,4]})

4df2=ame({"x":["a","B","c","D"],"y":[1,2,4,3]})

5print(df1)

6"""

7xy

80a1

91b2

102c3

113d4

12"""

13print(df2)

14"""

15xy

160a1

171B2

182c4

193D3

20"""

21print(df1[["x"]].isin(df2))

22#DataFrame中有两列,所以是两列布尔值

23"""

24xy

250TrueTrue

261FalTrue

272TrueFal

283FalFal

29"""

30#我们来分析⼀下,对于df1来说,前两⾏肯定是没有问题的

31#但是第三⾏有点诡异,earr 我们df1的第三⾏的y列是3,显然3是在df2的y列当中啊,为什么是Fal

32#同理第4⾏,"d"不在df2的x列中我们知道,但是y列的4很明显在df2的y列当中,为什么是Fal

估计有⼈猜到了,那就是对DataFrame使⽤isin的时候,多个列之间并不是独⽴的。事实上,DataFrame使⽤isin也是根据索

引来的,我们举个栗⼦

1importpandasaspd

2

3df1=ame({"x":["a","b","c","d"],"y":[1,2,3,4]})

4df2=ame({"x":["a","b","c","d"],"y":[1,2,3,4]})

5#两个⼀模⼀样的DataFrame对象

6print((df2))

7"""

8xy

90TrueTrue

101TrueTrue

112TrueTrue

123TrueTrue

13"""

14#结果没问题,但是我们将df2的索引改变⼀下

=[0,1,3,2]

16print((df2))

17"""

18xy

190TrueTrue

201TrueTrue

212FalFal

223FalFal

23"""

24#此时我们就看到端倪了,对于DataFrame对象来讲,isin是判断对应索引的字段的值是否相同

但是问题⼜来了,因为这样显然不是我们期望的结果。因为即使df2中存在,但如果索引对不上的话也没有任何意义,因此我

们可以⼿动设置索引。

1importpandasaspd

2

3df1=ame({"x":["a","b","c","d"],"y":[1,2,3,4]})

4df2=ame({"x":["a","b","d","c"],"y":[1,2,4,3]})

5

6#我们将x和y设置为索引不就⾏了,加上drop=Fal表⽰设置索引的同时,还作为列

7df1=_index(["x","y"],drop=Fal)

8df2=_index(["x","y"],drop=Fal)

9print(df1)

10"""

11xy

12xy

13a1a1

14b2b2

15c3c3

16d4d4

17"""

18print(df2)

19"""

20xy

21xy

22a1a1

23b2b2

24d4d4

25c3c3

26"""

27

28print((df2))

29"""

30xy

31xy

32a1TrueTrue

33b2TrueTrue

34c3TrueTrue

35d4TrueTrue

36"""

37#在通过all(axis=1)即可找到满⾜条件的值

38print((df2).all(axis=1).values)#[TrueTrueTrueTrue]

39

40#我们看到此时根据索引去找,就能够准确的定位了

41#不过细⼼的⼈可能已经发现了,这个索引是由x和y两列得到的,事实上索引如果匹配上了,那么值⼀定是相等的

42#所以此时就没必要在进⾏对⽐了

43#是的,所以我们可以换⼀种⽅法

44df1=ame({"x":["a","b","c","d"],"y":[1,2,3,4]})

45df2=ame({"x":["a","b","d","c"],"y":[1,2,4,3]})

46

47#pandas中有⼀个Index类,Series和DataFrame的索引就是Index类型

48#当然Index分为好⼏种,但是它们继承⾃Index

49print(type())#

50#根据x和y两列创建Index对象

51index1=(df1[["x","y"]])

52index2=(df2[["x","y"]])

53print(index1)#Index([('a',1),('b',2),('c',3),('d',4)],dtype='object')

54print(index2)#Index([('a',1),('b',2),('d',4),('c',3)],dtype='object')

55

56#Index对象可以像集合⼀样,取并集、交集,当然此时我们可以直接使⽤isin

57#因为它们整体变成了⼀个元组,也就是说,此时是⼀个⼀维序列,对于⼀维序列可以直接使⽤isin

58#直接返回⼀个numpy中的array

59print((index2))#[TrueTrueTrueTrue]

然⽽这么做有⼀个弊端,没错,我要复现我们上⾯的异常了

1importpandasaspd

2

3df1=ame({"x":["a","b","c","d"],"y":[1,2,3,4]})

4df2=ame({"x":["a","a","c","d"],"y":[1,1,3,4]})

5

6#我们将x和y设置为索引不就⾏了,加上drop=Fal表⽰设置索引的同时,还作为列

6#我们将x和y设置为索引不就⾏了,加上drop=Fal表⽰设置索引的同时,还作为列

7df1=_index(["x","y"],drop=Fal)

8df2=_index(["x","y"],drop=Fal)

9

10try:

11print((df2))

12exceptExceptiona:

13print(e)#cannotcomputeisinwithaduplicateaxis.

14

15#我们对⼀个DataFrame使⽤isin,那么要求isin⾥⾯的DataFrame的索引是不可以重复的,否则就会报出上⾯这个错误

16#解决办法是使⽤

17print((df1[["x","y"]]).isin((df2[["x","y"]])))#[TrueFalTrueTrue]

18

19#然鹅,我记得这种做法也不保险

20#由于索引的特殊性,好像这种情况我记得也报错,但是⽬前没有

21#因此最稳妥的办法是再转成Series

22s1=((df1[["x","y"]]))

23s2=((df2[["x","y"]]))

24

25print(s1)

26"""

270(a,1)

281(b,2)

292(c,3)

303(d,4)

31dtype:object

32"""

33print(s2)

34"""

350(a,1)

361(a,1)

372(c,3)

383(d,4)

39dtype:object

40"""

41print((s2))

42"""

430True

441Fal

452True

463True

47dtype:bool

48"""

49#这种做法是百分之百没有问题的

50

51

52#忘记说了,(df2)的时候,两个列的名称⼀定要对应

53df1=ame({"x":["a","b","c","d"],"y":[1,2,3,4]})

54df2=ame({"a":["a","a","c","d"],"y":[1,1,3,4]})

55print((df2))

56"""

57xy

580FalTrue

591FalFal

602FalTrue

613FalTrue

62"""

63#由于df2中没有x这⼀列,因此相当于NaN,所以结果为Fal

64print(df1[["y"]].isin(df2))

65"""

66y

670True

681Fal

692True

703True

71"""

72#会⾃动找df2中名称为y的列进⾏⽐较,因此记得注意列名

73#当然由于(df2)在索引⽅⾯的局限性,我们⼀般也不会使⽤这种⽅法

74#⽽是会将DataFrame的每⼀个字段的值拼接成⼀个元组,整体得到⼀个Series对象

74#⽽是会将DataFrame的每⼀个字段的值拼接成⼀个元组,整体得到⼀个Series对象

75#然后对Series对象使⽤isin,这是最正确的做法

rror:cannottaframewithnodefinedindexandascalar

这个错误不是很常见,我们来看⼀下。

1importpandasaspd

2

3df=ame({"a":[1,1,1,1],"b":[1,1,1,1]})

4

[df["a"]>2,"c"]=1

6print(df)

7"""

8abc

9011NaN

10111NaN

11211NaN

12311NaN

13"""

我们将df["a"]>2的记录选出来,然后同时创建"c"这⼀列,并设置对应的记录为1。如果不满⾜条件,那么会⾃动为NaN,⽽

我们没有满⾜条件的记录,所以全部为NaN

1importpandasaspd

2

3df=ame({"a":[1,1,1,1],"b":[1,1,1,1]})

4

[:,"c"]=1

6print(df)

7"""

8abc

90111

101111

112111

123111

13"""

上⾯这种赋值⽅式也是可以的,我们之前说,对于⼀维序列,df["xx"]等价于[:,"xx"],但实际上还是有点区别的,那就

是后者要求DataFrame不可以为空

1importpandasaspd

2

3df=ame({"a":[],"b":[]})

4print(df)

5"""

6EmptyDataFrame

7Columns:[a,b]

8Index:[]

9"""

10

11try:

[:,"c"]=1

13exceptExceptiona:

14print(e)#cannottaframewithnodefinedindexandascalar

15

16#空DataFrame的话,只能⽤df["c"]=1的⽅式

17df["c"]=1

18print(df)

19"""

20EmptyDataFrame

21Columns:[a,b,c]

22Index:[]

23"""

rror:Ifusingallscalarvalues,youmustpassanindex

这个错误应该遇见的⽐较少,我们看看这种错误是怎么发⽣的。

1importpandasaspd

2

3#我们说通过字典构建DataFrame,value应该是序列,不应该是⼀个标量

4try:

5df=ame({"a":123,"b":None})

6exceptExceptiona:

7print(e)#Ifusingallscalarvalues,youmustpassanindex

8

9#如果传递标量的话,那么应该同时指定⼀个index,index是只有⼀个元素的列表,⾥⾯是⼀个索引

10df=ame({"a":123,"b":None},index=["索引"])

11print(df)

12"""

13ab

14索引123None

15"""

有待发掘。。。。

本文发布于:2023-04-19 14:59:22,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/504320.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:青金石手串
标签:5see
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图