pandas使用中的坑


这里部分内容参考公众号:Python小例子

文件读写

问题1

使用pandas.read_excel 读取xlsx文件时报错,list index out of range
出现该情况时,读取的文件为xls文件另存为得到的xlsx文件
将文件里的单元格完整复制到新建的xlsx文件重新读取,不再报错
机理暂不明确,可能是read_excel对xls格式不支持
转载于:https://www.cnblogs.com/travelcat/p/11510402.html

问题2

利用read_csv()和to_csv()读取csv文件时,中文经常出现乱码,其原因时编码问题,csv的默认编码方式不是UTF-8而是GB18030,因此应该用下面的代码:

data = pd.read_csv('sample.csv', encoding='GB18030')
df.to_csv("textwrite.csv",encoding="GB18030")

字典转DataFrame()的问题

想要将字典直接转为DataFrame格式时,除了字典外没有传入其他参数时,会报错 ValueError: If using all scalar values, you must pass an index

直接在创建DataFrame时设置index

import pandas as pd
dict_data = {'name':'nxf','age':24}
data = pd.DataFrame(dict_data,index=[0])
print(data)
#   name  age
# 0  nxf   24
# list的赋值

通过from_dict函数将value为标称变量的字典转换为DataFrame对象

import pandas as pd
dict_data = {'name':'nxf','age':24}
data = pd.DataFrame.from_dict(dict_data,orient='index')
print(data)
#         0
# name  nxf
# age    24

列表名义赋值与变量赋值

名义赋值:

a=[1,2,3]
b=a#这里只是名义赋值
a[0]=10
print(b)
#[10, 2, 3]

变量赋值:

a=[1,2,3]
b=a[:]
#b=a.copy()效果一样
a[0]=10
print(b)
#[1, 2, 3]

列表快速赋值之坑

单列表快速复制:

a=[1,2,3]*3
a[0]=10
print(a)
#[10, 2, 3, 1, 2, 3, 1, 2, 3]

嵌套列表快速复制:

a=[[1,3,5],[2,4]]*3
print(a)
#[[1, 3, 5], [2, 4], [1, 3, 5], [2, 4], [1, 3, 5], [2, 4]]
a[0][0]=10
print(a)
#[[10, 3, 5], [2, 4], [10, 3, 5], [2, 4], [10, 3, 5], [2, 4]]

原因:*复制是浅复制,也就是说id(a[0])与id(a[2])门牌号是相等的。
如果要实现深复制可以:

a=[[1,3,5],[2,4]]
a=[a[x][:] for x in list(range(2))*3]
a[0][0]=10
print(a)
#[[10, 3, 5], [2, 4], [1, 3, 5], [2, 4], [1, 3, 5], [2, 4]]

列表循环之坑

a=[1,3,2,3,4,3,6]
for x in a:
    print(x)
    if x==3:
        a.remove(x)
# 1
# 3
# 3
# 3

原因:为什么遍历结果中没有2,4,6?这就是循环对象变动造成的结果,可以体会一下。

字典赋值问题

a={1:'java',1.0:'python'}
a
#{1: 'python'} 
# 1:'java'缺消失了
a[1]
# 'python'
a[1.0]
# 'python'

原因:具有相同的不可变对象在Python中始终具有相同的哈希值

生成器

array=[1,3,5]
g=(x for x in array if array.count(x)>0)
array=[5,7,9]
print(list(g))
#[5]

等价于:

g=(x for x in [1,3,5] if [5,7,9].count(x)>0)
print(list(g))

总结:生成器表达式中,in子句在声明时执行,而条件子句则是在运行时执行。

for不接受循环变量的赋值

for i in range(5):
    print(i)
    i=3
# 0
# 1
# 2
# 3
# 4

lambda函数之坑

a=[lambda x: x+i for i in range(3)]
for f in a:
    print(f(1))   
# 3
# 3
# 3

为什么输出不是1,2,3?因为lambda使用的i被称为自由参数,它只在调用lambda函数时,值才被真正确定下来。
正确的做法:

a=[lambda x,i=i: x+i for i in range(3)]
for f in a:
    print(f(1))
# 1
# 2
# 3

pandas读写数据占内存过大的解决方法

https://blog.csdn.net/iizhuzhu/article/details/102875602

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值