Cdccc_daye 2022-03-21 21:13 采纳率: 100%
浏览 42
已结题

Python pandas包里创建DataFrame对象时的奇怪现象,希望能和大家讨论一下DataFrame的底层逻辑和运行规则

问题遇到的现象和发生背景

大一学生,最近在系统学习pandas(原理入手),在读校本教材的一个例题代码,和自己看其他书籍做笔记顺便写测试码的时候发现了两个奇怪的现象

一、对于一个创建好的DataFrame对象,进行 list() 处理后,得到的是以该对象的columns属性为数组元素的列表(相当于提取了列索引)
而不是一个以Series对象为数组元素的列表
二、如果我试图让一个以Series对象为数组元素的数组,去创建一个DataFrame,如果我设置了列索引,则他只会提取出每一个Series里的第一个,并把提取出来的组成了一个新的Series,其他的全部变成NaN,且原有Series的index被覆盖

问题相关代码,请勿粘贴截图
import pandas as pd
#随便创建四个Series实例
a=pd.Series(['a','b','c','d','e','f'],index=[1,5,3,8,6,9])
b=pd.Series(['df','b','c','dsfag','ereee','qfqqq'],index=[1,5,3,8,6,9])
c=pd.Series(['aasd','b','sfc','d','e','mzvsf'],index=[1,5,3,8,6,9])
d=pd.Series(['aefe','dcsb','kmckc','hdind','uhge','jklkf'],index=[1,5,3,8,6,9])

#如果列表以Series为元素,用此列表参与DataFrame的创建
data = pd.DataFrame([a,b,c,d],columns=[1,'sduf',32,'cnja'])
print('data的模样是这样的\n',data)
#会发现数据变了,而且原来Series的index属性也被覆盖了
print('\n')

data = pd.DataFrame([a,b,c,d])
print('如果不设置列索引,data是这样\n',data)
#原来Series的index被覆盖了!
print('\n')

#如果就用二维列表创建DataFrame,会如何
data1 = pd.DataFrame([['xyz','abc'],['xcb','cdc']],columns=['nihao','hello'])
print('data1的模样是这样的\n',data1)
print('\n')


#直接用字典列表创建DataFrame,不能定义columns,因为字典的键会被认为是columns
#其实这个时候一个字典相当于一行,index值可以自行设置
#对于以字典为值的列表来说,字典的键值对个数不做要求
data2 = pd.DataFrame([{'第一列':'a',"第二列":'b'},{'第三列':'dakgaknf'}])
print("data2的模样是\n",data2)
print('\n')

#值为列表的字典,每一个键值对会被看做是一个Series,index值需要自行设置
#如果采取列表字典设置DataFrame,请一定保证每一个字典的值的那个列表长度一致
data3 = pd.DataFrame({'a':[1,2,3],'b':[3,5,4]})
# 如果我写成这样→data3 = pd.DataFrame({'a':[1,2,3],'b':[3,5,4,6]}),就会报错
print('data3的长相是\n',data3)
print('\n')

#单独创建一个以Series为元素的列表,看看列表里的元素会不会在创建列表的时候被改变
m = [a,b,c,d]
if(m[0] is a):
    print("如果你把Series放进列表里,它不会被改变")
print('\n')
#上次就碰到过的如果直接对DataFrame取list会获得它的columns属性
#正规的用一个以Series为值的字典来创建DataFrame
data=pd.DataFrame({1:a,'sduf':b,32:c,'cnja':d})
print('list(data)的模样是\n',list(data))

运行结果及报错内容

没有报错

img

我的解答思路和尝试过的方法

我的思路大概是,我首先去思考了Series对象和DataFrame对象的特征,我试图从他们的构造方法以及一些构造实例里大概看看它的原理
因为我尝试的出发点在于,DataFrame可以被看作一系列的Series的组合,在我设置了相同的index之后,如果我对几个Series来进行处理,并设置没有的columns属性,应该是不会出问题的,但是出问题了。我不太懂它的底层逻辑到底是什么

我的理解是产生不了映射关系,或者映射关系在这里出了问题

我试图写了一个解释,但是我现在觉得我的解释有问题(因为我在写这个帖子的时候突然想到,如果我不设置columns会发生什么)
我似乎是实现了行列的颠倒

我想要达到的结果

想要一点思维的碰撞,晦涩生疏也没关系我愿意去查。

  • 写回答

2条回答 默认 最新

查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 3月21日

悬赏问题

  • ¥20 Intellij实现web登录界面
  • ¥15 IPQ5018制作烧录固件,boot运行失败(操作系统-linux)(相关搜索:操作系统)(相关搜索:操作系统)
  • ¥20 icefall在librispeech基础上加入个人数据集
  • ¥30 keepalive高可用故障运维配置询问
  • ¥15 求帮助!国家电网内网u盘突然识别不出来了。
  • ¥15 matlab语音变速变调同时实现
  • ¥15 如何用Thoony写ESP32温湿度检测无源蜂鸣器报警代码?
  • ¥20 部件内部的CT图像数据集
  • ¥15 Visual studio调用动态库
  • ¥15 双目摄像头标定后的校准文件