文章目录
这里部分内容参考公众号: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