import pandas as pd
pands 的数据读取:
pd.read_csv(fpath)
pd.read_excel(fpath)
#读取cvs文件
fpath = r"./文件名.csv"
data = pd.read_csv(fpath)
#读取txt文件
fpath = r"./文件名.txt"
data = pd.read_csv(fpath, sep="\t", header=None, names=['属性1', '属性2', '属性3'])
'''读取txt文件其实和读取csv一样,参数sep设置分隔符,header设置有无表头,
name可以设置每一列的属性名称,不过很少读取csv就是了,了解一下'''
#读取excel
fpath = r"./文件名.xlsx"
data = pd.read_excel(fpath,sheet_name='工作薄名称',header=1,
usecols=[0,1,3], dtype={0:str,1:float})
'''
fpath表示文件目录
sheet_name参数为读取工作薄的名称
header表示用第几行作为表头,默认header=0,即默认第一行为表头
usecols表示读取的列数,输入一个list,读取数字对应的列数
dtype表述读取列数据的格式,dtype={0:str,1:float}表示第0列以str形式读取,第1列以float形式读取
'''
pands读取数据后,查看数据属性:
1、# 查看数据的形状,返回(行数、列数)
data.shape
2、# 查看列名列表
data.columns
3、# 查看索引列
data.index
4、# 查看前几行数据
data.head()
5、# 查看各个数据的计数
df["故障种类"].value_counts()
一些操作:
删除重复数据:
data.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
代码中subset对应的值是列名,表示只考虑这两列,将这两列对应值相同的行进行去重。
默认值为subset=None表示考虑所有列。
keep='first'表示保留第一次出现的重复行,是默认值。keep另外两个取值为"last"和False,
分别表示保留最后一次出现的重复行和去除所有重复行。
inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。
合并数据:
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
参数axis=0表示上下合并,1表示左右合并,ignore_index=True表示忽略原来的索引
上下合并时,如果原来没有的列,会用nan填充:
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df3 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
pd.concat([df1,df2,df3],axis=0)
左右合并时,可能会出现同样列名的列:
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df3 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
pd.concat([df1,df2,df3],axis=1)
描述性显示关于数据的简短统计摘要:
data.describe()
描述数据最大最小值、平均值、总数等
描述一列中各个值的统计数据:
data['区县'].value_counts(dropna=False)
dropna=False时,会把空值也进行统计
保存excel:
to_excel( excel_writer,sheet_name='sheet1',na_rep='空' ,index=False)
# excel_writer为表名,sheet_name为sheet名称,na_rep表示填充空数值的内容,index表示是否 保存 df 数据的索引到表格中
保存多个sheet:
import pandas as pd
# 创建一些示例数据
data1 = {'Column1': [1, 2, 3, 4],
'Column2': ['A', 'B', 'C', 'D']}
data2 = {'Column3': [5, 6, 7, 8],
'Column4': ['E', 'F', 'G', 'H']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# 创建一个ExcelWriter对象
with pd.ExcelWriter('multi_sheet_example.xlsx', engine='xlsxwriter') as writer:
# 将每个数据框写入不同的sheet
df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet2', index=False)
PS:请确保已经安装了openpyxl
或xlsxwriter
库,以便Pandas能够写入Excel文件。可以根据需要选择其中一个库,只需将engine
参数设置为'openpyxl'或'xlsxwriter'。
判断pd的值是否为nan:
pd.isnull( df ['故障种类'] ) #返回series
pd.isnull( df ['故障种类'][0] ) #返回 True or False
设置某一列为索引列:
df.set_index('name', inplace=True)
重置索引列:
data.reset_index()
修改列名:
df.rename(columns={'故障种类':'id','单号':'编码'},inplace=True)
判断是否包含字段:contains
df[ "故障种类" ].str.contains('中断')
#返回一个存储布尔值的DataFrame
判断是否以某个字段开头:startswith
df["tianqi"].str.startswith("晴")
#返回一个存储布尔值的DataFrame
比较df数值大小:
df["处理时长"]<60
#返回一个存储布尔值的DataFrame
特定的列填充空值:
fill_value = 0 # 要使用的填充值
df[‘某一列’].fillna(fill_value, inplace=True)
如果要全部填充所有列:df.fillna(fill_value, inplace=True)
复杂条件查询:
df.loc[(df["处理时长"]<=30) | (df["剩余时长"]>=15) & (df["是否恢复"]=='是') , :]
#将符合的数据以DataFrame返回
也可以定义函数进行复杂条件查询:
def query_my_data(df):
return df["处理时长"]<=30) | (df["剩余时长"]>=15) & (df["是否恢复"]=='是')
df.loc[query_my_data, :]
新增数据列:
1、直接为新增的列名赋值,可以是list或Series:
df[ '新增列名' ] = list(data)
2、使用apply函数:
def get_wendu_type(x):
if x["bWendu"] > 33:
return '高温'
if x["yWendu"] < -10:
return '低温'
return '常温'
# 注意需要设置axis==1,这是series的index是columns
df.loc[:, "wendu_type"] = df.apply(get_wendu_type, axis=1)
根据前一项或者后一项填充空值:
import pandas as pd
# 创建包含数据的DataFrame
data = {
'型号': ['飞驰500', None, None, None, '飞驰530', None],
'尺寸': ['18寸', '20寸', '22寸', '24寸', '18寸', '20寸'],
'价格': [640, 666, 693, 735, 640, 666],
'净重': [13.3, 14.0, 15.0, 16.0, 13.3, 14.0],
'毛重(kg)': [16.0, 17.2, 17.5, 18.4, 16.0, 17.2],
'保险毛重(kg)': [16.5, 17.5, 18.0, 19.0, 16.5, 17.5],
'国内顺丰运费': [60, 64, 68, 71, 60, 64]
}
df = pd.DataFrame(data)
# 使用bfill进行后向填充
# 使用ffill进行前向填充
df['型号'].fillna(method='bfill', inplace=True)
# 打印填充后的DataFrame
print(df)
行列处理:
行排序:sort_values()
sort_values()是pandas中比较常用的排序方法,设计以下参数:
by : 指定某一列或者某几列
ascending : 是否升序排序,默认升序为True,降序则为False。如果是列表,则需和by指定的列表数量相同,指明每一列的排序方式
na_position : {‘first’,‘last’}, default ‘last'.(如果指定排序的列中有nan值,可指定nan值放在第一个还是最后一个)
inplace: 是否用排序后的数据集替换原来的数据,默认为False,即不替换
df.sort_values(by=['处理时长'],na_position='first',inplace=True)
列排序:
调整列顺序:
df = df[['用户','处理时长','责任部门','维护人员']]调整index顺序:
df.index = range(1,len(df) + 1) # 将index改成从1开始
loc 函数 和 iloc 函数:
df.loc方法,根据行、列的标签值查询 (df.loc可以覆盖写入)
df.iloc方法,根据行、列的数字位置查询
使用df.loc查询和修改单个或者局部数值:
#查询
df.loc['禅城','退单人员']
#索引为'禅城'这一行的,'退单人员'这一列的数据,返回一个数值
df.loc['禅城',['退单人员','结单信息'] ]
#返回索引为'禅城'这一行的,'退单人员'和'结单信息'这两列的Series
#修改:
data.loc['禅城','退单人员'] = 'joke'
data.loc['禅城',['退单人员','故障种类']] = ['joke','业务中断']
使用df.loc修改整列数据:
df.loc[:,'故障种类'] = df['故障种类'].str.replace("#","").astype('int32')
#其实也可以这样:
df.loc[:,'故障种类']=[int(x.split("#")[0]) for x in list(df[ '故障种类' ]) ]
'''将“故障种类”这一类的所有数据进行修改,去掉“#”并转化为整数类型'''