Python读取处理Excel和csv文件【DataFrame】

测试代码使用的csv文件内容如下:
在这里插入图片描述


读取csv、excel文件

import pandas as pd
df=pd.read_csv(r'C:\Users\JM1307\Desktop\2015_09.csv')
df.to_csv(r'E:\2016.csv',index=False)

【对Excel文件的操作参考我的这篇博客

根据特定条件选取dataframe特定的数据部分

loc、iloc这两个函数都是用来选取dataframe特定的数据区域,具体的区别在代码中有解释。

设置选取条件:
df.loc[ 行的选取条件,列的选取条件 ]
我们还可以改这些位置上的数据,而且这样是直接改了原df:
df.loc[ 行的选取条件,列的选取条件 ] = 值

#这里行选取的条件是用的df['Vessel1']==10583这种方式(用Vessel1这列值等于10583选取行),列直接用列名WeightNew来选,并把相应WeightNew值改为9999
df.loc[df['Vessel1']==10583,'WeightNew']=9999
df.loc[(df['Vessel1']>=10583) & (df['Vessel2']<=14699),'WeightNew']  #可以加多个筛选条件,用&,|来连接


#如果要选取多列,就把这些列用()括起来,要改成多少,用列表括起来
df.loc[0,('Vessel1','Vessel2','Familiarity')]=[123,456,7.8]


#如果用数字来索引行/列,可以用:分号来选取多行/列,区间是左闭右开,但是这种纯数字索引的,需要用iloc,尤其是列的索引如果用数字的话
#上边那行虽然看起来loc行索引用了0,但是那是因为df默认就是有0到n-1的行索引嘿嘿~
#所以loc是按标签选取数据,iloc是按位置选取数据
df.iloc[0:3,4:]=[[999,888,777],[666,555,444],[333,222,111]]


# 0:3换成[0,1,2]也可以,那个冒号本质上就是形成了列表
df.iloc[[0,1,2],4:]=[[999,888,777],[666,555,444],[333,222,111]]

在这里插入图片描述

遍历dataframe的每一行

for index,row in df.iterrows():
    print(row['SSR'],row['Weight'])

只要dataframe的某几列

## 以两列为例
df[['Vessel1','Vessel2']] #方法1
df.loc[:,('Vessel1','Vessel2')] #方法2

统计相同的行的数量

print(df.values) #输出的是所有行的记录,一整行是一个value
print(df.value_counts()) #每种value(一行)的个数
print(df[['SSR','Weight']].value_counts()) #每种value(两列是一行)的个数
print(df.loc[:,('SSR','Weight')].value_counts()) #同上

创建空的dataframe,添加数据,保存成csv

import pandas as pd
import numpy as np
## 创建一个空的dataframe,有三列,分别是Vessel1、Vessel2、Weight_Predict
df=pd.DataFrame(data=None,columns=['Vessel1','Vessel2','Weight_Predict'])

for i in range(10):  #循环往空白dataframe里写10次数据,写10行
    df.loc[i]=[123,456,i] #用loc函数来添加数据,[123,456,i]对应那三列的值 
    
###或者用append来追加数据也可以,必须要加ignore_index=True     
#切记,append方法会返回新的dataframe,所以要保留返回值!!!(loc是修改原数据本身)
df=df.append({'Vessel1':8959,'Vessel2':6756,'Weight_Predict':3.255},ignore_index=True)  

df.to_csv(r'E:\2016.csv',index=False)  #这里一定要设置index=False,不然会出问题,影响到loc的那个索引

将列表存成csv文件

df_node=pd.DataFrame({'node':nodeList}) #以字典的这种方式传入列表
df_node.to_csv(r'E:\node.csv',sep=',',index=False)

求某一列的和、均值、最大值、最小值

df['Weight'].sum()
df['Weight'].mean()
df['Weight'].max()
df['Weight'].min()

查看某一列/所有列的类型

print(df['Vessel1'].dtype)
print(df.dtypes) #输出所有列的数据类型

修改某一列的类型

df['Vessel1']=df['Vessel1'].astype(int) #将原类型修改为int

让pycharm输出全部数据,去掉省略号

pd.set_option('display.max_rows',None)
pd.set_option('display.max_columns',None)

dataframe保存成csv时,中文出现乱码

#将编码方式设置为 utf_8_sig 即可
df.to_csv(r'C:\Users\JM1307\Desktop\1.csv',index=False,encoding='utf_8_sig') 

删除dataframe的行、列

【注:自己手动删除文件里的行或列,会破坏这个文件,不要手动删】
【drop函数不改变原来的dataframe,所以要保留一下返回值】

#删除行
## df.drop([行号列表],axis=0) 
df1=df.drop([0,4],axis=0)  #删除第0行和第4行
df2=df.drop(range(11),axis=0) #删除前11行

#删除列
## df.drop([列名],axis=0) 
df3=df.drop(['Vessel1','Vessel2'],axis=1) #删除vessel1和vessel2这两列

判断dataframe是否为空

【用len函数计算长度,间接判断是否为空】

if len(df)==0:
	print("空表")
	
if len(df.loc[df['Vessel1']==8959,:])!=0:
	print("有8959这条船的数据,非空")

持续更新中……

  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值