在做数据库数据导入时经常遇到单行数据存储多个信息,比如一个人的多个电话,多个邮箱,再或者是公司多个办公点等等
比如:
A公司 员工a,员工b 公司地址
我这的目的就是把上面的df拆分成下面这种
A公司 员工a 公司地址
A公司 员工b 公司地址
能力有限,逻辑就是暴力拆解,insert函数把特定多信息的给应拆分了,加到前面,然后再判断到最后一行了,再用第二个insert把原本数据给忽略掉,实测5000行数据大概要一分钟左右。有用的话,点个赞~
import pandas as pd
df=pd.read_excel(r'D:\New folder\x.xlsx')
df
def insert(df, i, add,detail):
df1 = df.iloc[:i, :]
df2 = df.iloc[i:, :]
df_add=df.iloc[i].to_dict()
df_add[add]=detail
df_add=pd.DataFrame(df_add,index=[0])
df_new = pd.concat([df1, df_add, df2], ignore_index=True)
return df_new
def last_insert(df, i, add,detail):
df1 = df.iloc[:i, :]
df2 = df.iloc[i+1:, :]
df_add=df.iloc[i].to_dict()
df_add[add]=detail
df_add=pd.DataFrame(df_add,index=[0])
df_new = pd.concat([df1, df_add, df2], ignore_index=True)
return df_new
def split_sth(df,c):
plist=df[c].to_list()
i=0
x=0
#我这是用“,”分割的数据,其他符号直接替换split里的内容就行
while i in range(len(plist)):
if len(str(plist[i]).split(','))>1:
s=0
print(str(plist[i]).split(','))
while s in range(len(str(plist[i]).split(','))):
print(i)
if s != len(str(plist[i]).split(','))-1:
df=insert(df, x, c,str(plist[i]).split(',')[s])
x+=1
s+=1
else:
df=last_insert(df, x, c,str(plist[i]).split(',')[s])
x+=1
s+=1
else:
x+=1
i+=1
return df