df_empty是1800行,256列的dataframe;df_pre是1800行75列dataframe。
我想用下面代码将data_pre里的的某个元素出现次数乘上它在data_pre里的最后一个位置数
"1/(1+pow(math.e,-l[-1]))"这样的函数作为新的newdata2的元素。df_empty.columns是很多名字,它包含了所有的data_pre里的所有元素。
这个代码很乱,而且跑出来结果还是全0的dataframe,崩溃了,求解决。
for i in range(len(df_empty.columns)):
for idx in range(1800):
for j in range(len(data_pre.columns)-1):
if df_empty.columns[i] in data_pre.iloc[j]:
l = data_pre.loc[idx][data_pre.loc[idx].values == df_empty.columns[i]].index
newdata2[i][idx] = data_pre.iloc[idx].tolist().count(df_empty.columns[i])*(1/(1+pow(math.e,-l[-1])))
这样可以
import math
import pandas as pd
import numpy as np
#所有的读取文件均删除了索引列,这些代码不集中展现,以后保存csv的时候注明to_csv=false
data_pre=pd.read_csv('data_pre.csv')
data_pre['row']=data_pre.index#注明数据的行
#reshape成长数据,写成每一个名字对应某行某列的形式
data_shape=pd.melt(data_pre,id_vars='row',value_vars=data_pre.columns[:-2],var_name='col',value_name='name')
#把列名转为整形
data_shape['col']=data_shape['col'].astype("int")
#以行-名字对列进行分类汇总统计,max就是每行最后出现的那个列所以是最大值
group_data=data_shape.groupby(['row','name'])['col'].agg(['count','max'])
#你可以单独运行这个语句print一下看看有什么区别
group_data=group_data.reset_index()
#函数对应
group_data['result']=group_data['count']/(1+math.e**(-group_data['max']))
#变成宽数据,此时名字变成了各个列名
wide_data=group_data.pivot(index='row',columns='name',values='result')
#行中没有该名字的本为缺失,替换为0
wide_data.fillna(0,inplace=True)
empty_csv=pd.read_csv('df_empty.csv')#读取目标列名
null_data=np.zeros((len(wide_data),len(empty_csv.columns)))
resort=pd.DataFrame(data=null_data,columns=empty_csv.columns)#先建立一个1800*249的空数据
for each in resort:
resort[each]=wide_data[each]#逐列对应补充
resort.to_csv('result.csv',index=False)
原始数据share下,我研究下
data_empty
想按照df_empty的格式,将data_pre里的各种名字的数量一一放进去乘以相对位置和那个函数。