pandas学习

举报
applegenius 发表于 2026/04/08 09:47:04 2026/04/08
【摘要】 1.pandas学习 1) 以第二行作为表头sh_all =pd.read_excel(path,'总览',header =1)#pandas 有两种对象:Series (表中的一行或一列数据) 和 DataFrame(一张表) 2) 筛选,选择列同时筛选两项,后指定展示列sh_all =sh_all.loc[(sh_all['检查结果'] == '风险项') & (sh_all['风险等...

1.pandas学习

1) 以第二行作为表头

sh_all =pd.read_excel(path,'总览',header =1)

#pandas 有两种对象:Series (表中的一行或一列数据) 和 DataFrame(一张表)

2) 筛选,选择列

同时筛选两项,后指定展示列
sh_all =sh_all.loc[(sh_all['检查结果'] == '风险项') & (sh_all['风险等级'] == '高危'),['产品','检查项名称','检查内容']]

筛选一项
sh_all2 =sh_all.loc[sh_all['检查结果'] == '风险项',['产品','检查项名称','检查内容','风险等级']]

不筛选,选择列
con_num_data_end = con_num[["资源类型","分析维度","风险状态","风险总数"]]




3) 遍历每个sheet的每个值后模糊匹配,然后插入表格

sh_fengxianmun=[]
for i in sh_all["检查项名称"] :
    sh_data = pd.DataFrame(pd.read_excel(path,i))
	#对于iloc[:,0]是取二维数组中第一维的所有数据
    sh_tmp=sh_data.iloc[:,0].to_frame()
    sh_tmp.columns =['A']
    sh_value = sh_tmp[sh_tmp['A'].str.contains('风险资源数',na=False)]
    #直接添加sh_value有中方括号,只能循环一次再添加,暂时没有其他好的方法
    for j in sh_value['A'] :
        sh_fengxianmun.append(j)
#print(sh_jianyi)

sh_all.insert(loc=len(sh_all.columns),column ="风险资源数/资源总数",value= sh_fengxianmun)
#loc=:插入的位置,0为第一列前面插入

#新加一空列
df_new.insert(loc=len(df_new.columns),column ="风险总数",value='')

#分列后插入
temp_con=con_num['资源类型tmp'].str.split(':',expand=True)
con_num.insert(loc=0,column ="风险状态",value=temp_con[2])
con_num.insert(loc=0,column ="分析维度",value=temp_con[1])
con_num.insert(loc=0,column ="资源类型",value=temp_con[0])


4) 分列

temp2=sh_all['风险资源数/资源总数'].str.split(':',expand=True)
sh_all['风险资源数/资源总数']=temp2[1]

Series.str.split(pat=None, n=-1, expand=False)
-- pat 分隔符
-- n 指定分割次数 -1代表全部
-- expand=True expand表示是否展开为数据框,True输出Series,False输出Dataframe
-- 支持正则表达式分割符
	import pandas as pd
		s = pd.Series(["1+1=2"])
		s.str.split(r"\+|=", expand=True)
		'''
		   0  1  2
		0  1  1  2
		'''

str.rsplit从右往左寻找分列依据,使用语法类似 split。

split() 方法通过指定分隔符对字符串进行切分,返回分割后的字符串列表。

使用语法为:
str.split(str=" ", maxsplit=string.count(str))

参数:
-- str 分隔符 默认为所有的空字符 包括空格、换行符、制表符等
-- maxsplit 分割次数 默认-1 即分割所有

实例:
str = "abc ggg rrr"
str.split() # ['abc', 'ggg', 'rrr']
str.split(" ",maxsplit=1) # ['abc', 'ggg rrr']

5) 保存表格去除索引

sh_all.to_excel('tmp1.xlsx',index=None)

6) 表格多少行

sh_all = pd.DataFrame(pd.read_excel(path,'总览',header =2))
sh_all2 =sh_all.loc[sh_all['检查结果'] == '风险项',['产品','检查项名称','检查内容','风险等级']]
check_auto = len(sh_all2)

7) 删除其他sheet,或者原格式保留一个sheet

wb = load_workbook(path)
for i in wb.sheetnames :
    if i != '可用性优化' :
        ws = wb[i]
        wb.remove(ws)

8) 多sheet筛选后数据行合并

pandas的连接函数concat()函数

data = pd.read_excel(path,None)
#获取所有sheet名
sheet=data.keys()
#创建新数据框
df_new = pd.DataFrame()
for name in sheet :
    #print(i)
    df_pre = pd.DataFrame(pd.read_excel(path,name),columns=['资源类型','分析维度','风险状态'])
    df_new = pd.concat([df_new,df_pre])

#https://blog.csdn.net/zzpdbk/article/details/79232661
#列合并
#https://blog.csdn.net/Asher117/article/details/84725199

9) 全表单元格内容替换,支持正则表达式


df_new.replace('挂载点.*磁盘使用率','磁盘使用率',regex=True,inplace=True)

#regex=True,支持正则表达式,inplace=True,修改原表

10) pandas的DataFrame怎么把几列数据合并成为新的一列


parent_teacher_data['address'] = parent_teacher_data['country']+parent_teacher_data['province']+parent_teacher_data['city']+parent_teacher_data['county']

就可以把四列合并成新的列address

如果某一列是非str类型的数据,那么我们需要用到map(str)将那一列数据类型做转换:
dataframe["newColumn"] = dataframe["age"].map(str) + dataframe["phone"] + dataframe["address”]

原文链接:https://blog.csdn.net/gangyin5071/article/details/79601386

11) excel中countif的效果,计数后变DataFrame类型

#value_counts() 变DataFrame
#rename_axis:原需要统计的列名,reset_index:value_counts后的结果
con_num = df_data_h.value_counts().rename_axis('资源类型tmp').reset_index(name='风险总数')

#https://stackoverflow.com/questions/47136436/python-pandas-convert-value-counts-output-to-dataframe
https://cloud.tencent.com/developer/article/1877700
.value_counts()函数可以直接计算整行的值,不用先合并成一列再运算

测试代码
import pandas as pd
import os
os.chdir(os.path.dirname(__file__))
data = pd.DataFrame({
     'num_legs': [2, 4, 4, 6],
     'num_wings': [2, 0, 0, 0]},
     index=['falcon', 'dog', 'cat', 'ant'])
print(data)
print(type(data))
#<class 'pandas.core.frame.DataFrame'>
data.to_excel('data.xlsx')

df_new = data.value_counts()
print(df_new)
print(type(df_new))
#<class 'pandas.core.series.Series'>
df_new.to_excel('df_new.xlsx')

df_new2 = data.value_counts().reset_index()
print(df_new2)
print(type(df_new2))
#<class 'pandas.core.frame.DataFrame'>
df_new2.to_excel('df_new2.xlsx')

df_new3 = data["num_wings"].value_counts()
print(df_new3)
print(type(df_new3))
#<class 'pandas.core.series.Series'>
df_new3.to_excel('df_new3.xlsx')

图片说明

图片说明

12) 排序

#以指定列排序
con_num_data_end = con_num_data_end.sort_values(by=["资源类型"])

13) xls转xlsx

import win32com.client as win32
#返回当前的目录
#nowpath = os.getcwd()

#需要绝对路径
abpath=os.path.abspath(path)

excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(abpath)

wb.SaveAs(abpath+"x", FileFormat = 51)    #FileFormat = 51 is for .xlsx extension
wb.Close()                               #FileFormat = 56 is for .xls extension
excel.Application.Quit()
#https://blog.csdn.net/yizhuanlu9607/article/details/89227908

14) 删除列名和单元格前后的空格

col_names = sh_all.columns.tolist() # 获取列名字
    # 把列名中的空格去掉
for index,value in enumerate(col_names):
    col_names[index]= value.replace("\t","")

    # 修改列名字
sh_all.columns=col_names

print(sh_all.columns.values)

for col in sh_all.columns.values :
    sh_all[col]=sh_all[col].str.strip()

15)模糊筛选

data=data[-data.客户名.str.contains("hwstaff|liuqiang|--|HuaweiDuoYun|huawei_qimao|CBG-RU|emui_test|omaalregion",na=False)]

#过滤两种方式都为空的列
sheetTop50=sheetTop50[-(sheetTop50['PATH方式访问的桶名'].isnull()&sheetTop50['LVS方式访问的桶名'].isnull())]

16)修改筛选后的其他列值

data.loc[data[(data['升降级提交时间'].str.contains("P3->",na=False))].index.tolist(),'事件级别'] = 'P3降'
#https://blog.csdn.net/chenKFKevin/article/details/62049060
#事件级别前面的这个是筛选出来的行数
data[(data['升降级提交时间'].str.contains("P3->",na=False))].index.tolist()
上面print结果[4, 5, 7, 10, 87, 95, 98, 101, 102, 108, 124, 0, 7, 9, 0, 2, 3, 4, 5, 8, 10, 11]

17)反向筛选


#删除客户名为--的行
        data=data[-data.事件级别.isin(['P4','P5'])]

18)匹配vlookup

#datacop是左表,datacopown是右表,on是查找的列
#datacop = pd.merge(datacop,datacopown.loc[:,:],how='left',on = '代表处')
#vlookup匹配
datacop = pd.merge(datacop,datacopown,how='left')
指定列
df['领域'] = df.merge(data_area, on='云服务', how='left')['领域']

19)countif

#对‘客户名+受影响部件所属产品部’计数,后结果插入新列‘客户名+受影响部件所属产品部计数’,之后再用上面的vlookup方法,实现countif的效果
df_data_h2 =result['客户名+受影响部件所属产品部']
        #value_counts() 变DataFramehttps://blog.csdn.net/weixin_42342968/article/details/121771731
        con_num2=df_data_h2.value_counts().rename_axis('客户名+受影响部件所属产品部').reset_index(name='客户名+受影响部件所属产品部计数')

        con_num2.to_excel('tmp8.xlsx',index=None)
        print("完成计数临时表tmp8.xlsx")

20)重命名列名

result_end4 = result_end4.rename(columns={'客户名+受影响部件(英文名)':'客户-受影响云服务'})

21)合并表格

dataend=pd.concat([result_end4,result_end1,result_end2,result_end3])

22)合并单元格

# 用这个方法
con_num_data_end = con_num_data_end[["云服务","分析维度","实例状态","风险总数","名称"]]
    con_num_data_end = con_num_data_end.sort_values(by=["云服务","分析维度","实例状态","风险总数"])

# 合并前要把NAN改为空值,要不然合并会有问题
    processed_row = processed_row.fillna('')
    con_num_data_end = con_num_data_end.groupby(["云服务","分析维度","实例状态","风险总数"])["名称"].apply(lambda x: '\n'.join(map(str, x))).reset_index()
    #这个也不需要con_num_data_end['资源名称'] = con_num_data_end['资源名称'].str.replace('\n', chr(10))
pualitypdCo1 = pualitypdCo1[['影响服务','风险说明','整改建议','风险详情答疑','租户名','风险及问题','检查项','region','实例ID']]

#合并的单元格的列最多不能超过总列数-1
pualitypdCo1_set = pualitypdCo1.set_index(['影响服务','风险说明','整改建议','风险详情答疑','租户名','风险及问题','检查项','region'])

pualitypdCo1_set.to_excel('puality_tmp.xlsx')

23)列提取出来后合并成列表

comName=[]
#extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
comName.extend(sheetTop50['客户企业名称'])
comName.extend(sheetCIM['客户企业名称'])
comName.extend(sheetIncrease['客户企业名称'])

24)将两列是否为空做判断,插入word不同的内容

#将表中空行替换为可识别的na,为后面isna做判断
noEmailCoPr.replace('',numpy.nan,inplace = True)
#指定列替换
df['email'].replace('', np.nan, inplace=True)

if co in sheetTop50['客户企业名称'].tolist() :
        sheetTop50co=sheetTop50[sheetTop50['客户企业名称'].isin([co])]
        sheetTop50copath = sheetTop50co[["PATH方式访问的桶名"]]
#将为空的单元格转换成bool值,后面用bool值提取后计算数量,原创        sheetTop50copathnan=sheetTop50copath.isnull()
        b=False
        sheetTop50copathnanF=sheetTop50copathnan[sheetTop50copathnan['PATH方式访问的桶名'].isin([b])]
        print (sheetTop50copathnan)
        print (sheetTop50copathnanF)

        print (len(sheetTop50copathnanF))
        sheetTop50colvs = sheetTop50co[["LVS方式访问的桶名"]]
        sheetTop50colvsnan=sheetTop50colvs.isnull()
        sheetTop50colvsnanF=sheetTop50colvsnan[sheetTop50colvsnan['LVS方式访问的桶名'].isin([b])]
        print (sheetTop50colvsnan)
        print (sheetTop50colvsnanF)

        print (len(sheetTop50colvsnanF))
        #if sheetTop50co['PATH方式访问的桶名'].isna().bool() == True :
        #if len(sheetTop50copath) == 0 :
        if len(sheetTop50copathnanF) == 0 :
        #if sheetTop50copath.isnull().bool() == True :这个报错原因是因为有两行的原因,
            word00.append(word31)
            sheetTop501=sheetTop50[sheetTop50['客户企业名称'].isin([co])]
            print("31")
            sheetTop501 = sheetTop501[["客户企业名称","账号","LVS方式访问的桶名"]]
        #elif sheetTop50co['LVS方式访问的桶名'].isnull().bool() == True :
        elif len(sheetTop50colvsnanF) == 0 :
            word00.append(word32)
            sheetTop502=sheetTop50[sheetTop50['客户企业名称'].isin([co])]
            print("32")
            sheetTop502 = sheetTop502[["客户企业名称","账号","PATH方式访问的桶名"]]
        else:
            word00.append(word3)
            print("3")
            sheetTop501=sheetTop50[sheetTop50['客户企业名称'].isin([co])]
            sheetTop501 = sheetTop501[["客户企业名称","账号","LVS方式访问的桶名"]]
            sheetTop502=sheetTop50[sheetTop50['客户企业名称'].isin([co])]
            sheetTop502 = sheetTop502[["客户企业名称","账号","PATH方式访问的桶名"]]

25)单元格多个值,按照分割符分行

#按照顿号分割,stack()然后列转行,reset_index(level=1, drop=True),level=1删除这个索引(1为二级索引,0开始),drop=True将原索引作为新的一列并入DataFrame,然后重命名为原来的名字
        data=data.drop('受影响部件(英文名)', axis=1).join(data['受影响部件(英文名)'].str.split('、', expand=True).stack().reset_index(level=1, drop=True).rename('受影响部件(英文名)'))
        #https://blog.csdn.net/weixin_44214830/article/details/121144628
        #https://blog.csdn.net/weixin_43298886/article/details/108090189
        data.to_excel('tmp3-1.xlsx',index=None)
        print("完成'受影响部件(英文名)'列中多个影响服务拆成多行,生成tmp3-1.xlsx")


26)提取对应的单元格内容

mailbox = pd.read_excel('邮箱.xlsx','Sheet1')
print (mailbox)
print (type(mailbox))
#<class 'pandas.core.frame.DataFrame'>
mailco=mailbox[mailbox['客户名称'].isin(['你好'])]
print (mailco)
mailbb = mailco['收件人'].values
print (mailbb)
print (type(mailbb))
#['121@qq.com;999sds@sem.com']
#<class 'numpy.ndarray'>
#下面这四个方法都可以
mailbb = mailco['收件人'].values.tolist()[0]
print (mailbb)
print (type(mailbb))
#<class 'str'>
mailcc =mailbox.loc[0,['收件人']].values[0][:]
print (mailcc)
print (type(mailcc))
#<class 'str'>
maildd =mailbox.loc[0,['收件人'][0]]
print (maildd)
print (type(maildd))
#<class 'str'>
mailee =mailbox.iloc[0,1]
print (mailee)
print (type(mailee))
#<class 'str'>

27)合并单元格填充

'''
bfill:向前填充
ffill:向后填充
默认 axis=0(列方向) , axis=1(行方向)
df1=df_.fillna(method='bfill',axis=1)
'''

sh_all = sh_all.ffill()
print(sh_all)

28)修改所有列名

#修改列名
sh_all.columns = sh_all.iloc[1]
print(sh_all)

29)读取为浮点数的百分数显示为百分数

#https://stackoverflow.com/questions/48977649/pandas-read-excel-percentages-as-strings
#https://blog.csdn.net/m0_73209313/article/details/127313149 读取表格参数详解

sheetIncrease = pd.read_excel(pathIncrease,'Sheet1',converters={'增长率': lambda value: '{}%'.format(value * 100)})

30)设置列宽、垂直居中等

wb = op.load_workbook('tmp1.xlsx')
ws = wb[wb.sheetnames[0]]

print(ws)

#设置列宽
ws.column_dimensions['C'].width = 35
ws.column_dimensions['D'].width = 30
ws.column_dimensions['E'].width = 20
ws.column_dimensions['F'].width = 20
ws.column_dimensions['G'].width = 30
ws.column_dimensions['H'].width = 30

#设置列宽
#columnname = ['B','C','D','E','F','G','H','I','J','K','L','M']
#for column in columnname:
#    ws1.column_dimensions[column].width = 13
#获取所有列的字母号https://www.jianshu.com/p/e122a997dff4
# 根据列的数字返回字母
#print(get_column_letter(2))  # B
# 根据字母返回列的数字
#print(column_index_from_string('D'))  # 4
#123456
col=[]
cl = 1
while cl <= ws.max_column :
    col.append(op.utils.get_column_letter(cl))
    cl +=1
# 设置B1中的数据垂直居中和水平居中
#sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

for i in col :
    wsC = ws[i]
    for cell in wsC:
        #自动换行,水平居中
        cell.alignment = op.styles.Alignment(wrapText=True,vertical='center')


#ws.save('down2.xlsx') sheet不能保存AttributeError: 'Worksheet' object has no attribute 'save'
wb.save('down2.xlsx')

31)保存txt为excel

data = pd.read_csv("tmp.txt", sep="\t")
            now = datetime.now()
            now = now.strftime("%Y-%m-%d %H%M%S")
            #调整列顺序
            data =data.loc[:,['域名','是否备案','公网是否可以访问','是否HTTPS访问','证书是否快到期','证书到期时间','主办单位名称','主办单位性质']]
            #data.to_excel(f"{now}域名查询结果.xlsx", index=False)
            writer = pd.ExcelWriter(f"{now}域名查询结果.xlsx",engine='xlsxwriter')
            data.to_excel(writer, sheet_name='Sheet1',index=False)
            worksheet = writer.sheets['Sheet1']
            #https://blog.csdn.net/qq_38963393/article/details/106187907
            worksheet.set_column("A:A", 25) # 在这里更改宽度值
            worksheet.set_column("B:B", 10) # 在这里更改宽度值
            worksheet.set_column("C:E", 18) # 在这里更改宽度值
            worksheet.set_column("F:F", 20) # 在这里更改宽度值
            worksheet.set_column("G:G", 30) # 在这里更改宽度值
            worksheet.set_column("H:H", 13) # 在这里更改宽度值
            writer.save()
            os.startfile(rootpath)

32)排序

#排序
# 以列“Fruit”的标签列来进行升序排列
df_1 = df.sort_values('Fruit',ascending=True)
#两列排序,Fruit进行降序排列,当Fruit中有相同的值则按Price进行降序排序。
df_3 = df.sort_values(['Fruit','Price'],ascending=[False,True])

33)日期列格式修改,5位数字改成正常格式

def Change_date(stamp) :
    delta =pd.Timedelta(str(stamp)+'D')
    realtime = pd.to_datetime('1899-12-30')+delta
    return realtime

rownum =0
for i in sheetCIM["事件发生时间"] :
    if len(str(i)) == 5 :
        #用函数将日期格式为5位数字的改成yyyy-mm-dd
        sheetCIM["事件发生时间"][rownum]=Change_date(sheetCIM["事件发生时间"][rownum])
        #将日期格式"2023-02-06 00:00:00"改为“2023-02-06”
        sheetCIM["事件发生时间"][rownum]=sheetCIM["事件发生时间"][rownum].strftime("%Y/%m/%d")
        #print(sheetCIM["事件发生时间"][rownum])
    rownum +=1

34)iloc、loc、openpyxl中cell的关系

import pandas as pd
import os
import glob
import sys
import openpyxl

if getattr(sys,'frozen',False) :
    rootpath  = os.path.dirname(sys.executable)
elif __file__ :
    rootpath = os.path.dirname(__file__)

os.chdir(rootpath)

tmppdold = pd.read_excel("1212.xlsx")
HApd_opxl = openpyxl.load_workbook("1212.xlsx")
HApd_opxl_ws = HApd_opxl["Sheet1"]
print("原表")
print(tmppdold)
tmppd=tmppdold.drop(tmppdold[tmppdold["a"] == 'a4'].index)
print("删除了一行的表")
print(tmppd)
tmppd=tmppdold.drop(columns='b')
print("删除了一列的表")
print(tmppd)
#已知iloc坐标值
print("已知:tmppd.iloc[4,2]:"+str(tmppd.iloc[4,2]))

#得到行索引值
print("得到行索引值:tmppd.index[4]:"+str(tmppd.index[4]))

#得到对应的列名
print("得到对应的列名:tmppd.columns[2]:"+str(tmppd.columns[2]))

#用loc方式表示iloc
print("用loc方式表示iloc:tmppd.loc[tmppd.index[4],tmppd.columns[2]]:"+str(tmppd.loc[tmppd.index[4],tmppd.columns[2]]))

#根据列名找到列号
print("根据列名找到列号:tmppd.columns.get_loc(tmppd.columns[2]):"+str(tmppd.columns.get_loc(tmppd.columns[2])))

#根据行索引找到行号
print("根据行索引找到行号:tmppd.index.get_loc(tmppd.index[4]):"+str(tmppd.index.get_loc(tmppd.index[4])))

#对应openpyxl的行号从1开始,标题也算一行,所以对应pd的索引要+2
print("对应openpyxl的行号从1开始,标题也算一行,所以对应pd的索引要+2:tmppd.index[4]+2:"+str(tmppd.index[4]+2))

#对应openpyxl的列号从1开始,所以对应pd要+1,如果列在pd中有调整,要用老表来找
print("对应openpyxl的列号从1开始,所以对应pd要+1,如果列在pd中有调整,要用老表来找:tmppdold.columns.get_loc(tmppd.columns[2])+1:"+str(tmppdold.columns.get_loc(tmppd.columns[2])+1))

#用openpyxl方式表示iloc
print ("用openpyxl方式表示iloc:HApd_opxl_ws.cell(tmppd.index[4]+2,tmppd.columns.get_loc(tmppd.columns[2])+1).value:"+str(HApd_opxl_ws.cell(tmppd.index[4]+2,tmppdold.columns.get_loc(tmppd.columns[2])+1).value))

原表
    a   b    c     d
0  a1  11  111  1111
1  a2  12  112  1112
2  a3  13  113  1113
3  a4  14  114  1114
4  a5  15  115  1115
5  a6  16  116  1116
删除了一行的表
    a   b    c     d
0  a1  11  111  1111
1  a2  12  112  1112
2  a3  13  113  1113
4  a5  15  115  1115
5  a6  16  116  1116
删除了一列的表
    a    c     d
0  a1  111  1111
1  a2  112  1112
2  a3  113  1113
3  a4  114  1114
4  a5  115  1115
5  a6  116  1116
已知:tmppd.iloc[4,2]1115
得到行索引值:tmppd.index[4]4
得到对应的列名:tmppd.columns[2]:d
用loc方式表示iloc:tmppd.loc[tmppd.index[4],tmppd.columns[2]]1115
根据列名找到列号:tmppd.columns.get_loc(tmppd.columns[2])2
根据行索引找到行号:tmppd.index.get_loc(tmppd.index[4])4
对应openpyxl的行号从1开始,标题也算一行,所以对应pd的索引要+2:tmppd.index[4]+26
对应openpyxl的列号从1开始,所以对应pd要+1,如果列在pd中有调整,要用老表来找:tmppdold.columns.get_loc(tmppd.columns[2])+14
用openpyxl方式表示iloc:HApd_opxl_ws.cell(tmppd.index[4]+2,tmppd.columns.get_loc(tmppd.columns[2])+1).value:1115

35)单元格格式的问题

如果一列都是数字,不管excel中每个设置的是什么格式(文本、邮编等等),pandas会把这一列都识别为class ‘numpy.float64’

如果一列中除了数字还有其他类型,,pandas会把这一列每个单元格单独识别

所以在做数据包含对比isin的时候需要map(str)来吧格式先统一

图片说明

type(IncreaseOldpd.iloc[0,0])

图片说明

36)pandas报cannot set a frame with no defined index and a scalar的一个原因

使用pandas时遇到‘ValueError: cannot set a frame with no defined index and a scalar’错误,其中一个原因可能是由于你正在对一个空的dataframe进行操作

在进行此类操作时要通过df.empty或者len(df)进行判断是否为空再进行操作

if not df.empty:
	df.loc[:, 'test'] = 1

37)合并后要重置索引

#合并前要把列名统一
datacop=pd.concat([result_cop1,result_cop2,result_cop3,result_cop4,result_cop5])
#去重
datacop=datacop.drop_duplicates(subset='公司名')
print (datacop)
#合并后要重置索引
datacop=datacop.reset_index(drop=True)
print (datacop)

38)拆分单元格为多行

sh_all = pd.read_excel(path,'总览')
# 指定要处理的值
target_value = 'Service Quota'
if target_value in sh_all['产品'].values:
    # 获取要处理的行
    row_to_process = sh_all[sh_all['产品'] == target_value].index[0]

    # 拎出要处理的行
    processed_row = sh_all.iloc[row_to_process:row_to_process + 1]
    processed_row = processed_row.reset_index(drop=True)
    print(sh_all)
    print(processed_row)
    # 从原表中删除该行
    sh_all = sh_all.drop(index=row_to_process)
    print(sh_all)
    # 将包含换行符的单元格的值拆分成多行
    print(processed_row)
    processed_row.at[0, '明细'] = processed_row.iloc[0, processed_row.columns.get_loc('明细')].split('\n')
    print(processed_row)
    # 使用explode将列表拆分成多行
    processed_row = processed_row.explode('明细')

    # 将其他列的NaN值填充为相邻的非NaN值
    processed_row = processed_row.fillna(method='ffill')
    processed_row = processed_row.reset_index(drop=True)
    processed_row = processed_row.drop(index= 0)

    tempp=processed_row['明细'].str.split('_',expand=True)
    processed_row = processed_row.copy()
    processed_row['产品'] = tempp[0]
    # 转换为大写
    processed_row['产品'] = processed_row['产品'].str.upper()
    print(processed_row)
    processed_row['产品'].replace('ALB', 'ELB', inplace=True)
    print(processed_row)
    # 合并前要把NAN改为空值
    processed_row = processed_row.fillna('')
    processed_row = processed_row.groupby(["产品","维度","检查项名称","检查内容","风险等级","风险资源数/资源总数","优化建议"])["明细"].apply(lambda x: '\n'.join(map(str, x))).reset_index()
    print(processed_row)
    # 将处理后的行重新插入到原表中
    sh_all = pd.concat([sh_all, processed_row], ignore_index=True)
    print(sh_all)
    print('完成可用性中服务配额转云服务')
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。