昨天又碰到一个难题,对于DataFrame中某一列值都是json格式的数据如何通过pandas进行分割转化。
下面给出造句的思路。其实想明白之后也就很简单了。
主要是用到列表的有序性,但前提要保证原DF中的值都是非空值。
sst = 'c:2,d:2,aa:0'
ssa = 'c:1,d:-1,aa:2'
lst = [sst,ssa]
data = pd.DataFrame({'a':lst})
# 制造数据
[ 's'+str(i) for i in range(101,103,)]
data['index'] = [ 's'+str(i) for i in range(100,102)]
# 增加一列值,也是用于数据检验,因元数据中一定还存在其他列,如果只有一列json数据也就不用这样麻烦了
def split_column(data,col):
'''
DF中的值存在字典map格式数据,需要分拆成列进行展示的时候。直接使用df.col.str.split('xx',expand=True)就行不通了,这样得出的结果还是单个
的map值。
因此 通过对列值先转换成列表,然后对列表元素进行分拆,组合成列表字典格式,最好再转换成df格式。因列表的有序性。
最后可以直接通过merge方法,通过相同索引合并原DF和列表字典转换后的DF就能实现了
'''
tent = col.values.tolist() #转成列表
tents = [] #定义空列表,用于接收DF中col分割后的字典
for i in tent:
dic = {}
for j in i.split(','): #这里分割,以目标值中的分割符为准
dic[j.split(':')[0]] = j.split(':')[1]
tents.append(dic) #完成接收
df = pd.DataFrame(tents) #列表字典转换成DF格式
for i in df.columns.tolist(): #针对字典的值为数字的,进行数值转换。如果值不为数字的,或者无需求的请pass掉 这个for循环
df[i] = df[i].astype('int')
data_new = pd.merge(data,df,left_index=True,right_index=True) #将原DF和处理后的DF索引合并
return data_new
df_new = split_column(data,data['a'])
#函数调用
分拆处理结果如下图: