美文网首页
pandas处理csv,根据列名取数

pandas处理csv,根据列名取数

作者: 山猪打不过家猪 | 来源:发表于2019-12-25 16:08 被阅读0次

根据列名取数

df = pd.read_excel('1.xls')
cc = df.fillna(0)
all_row = cc.shape[0]
colunmName = df.columns.values  # 列名
data_name = ['宝贝Id','计划Id','消耗','曝光量','加购量','收藏量','成交金额'] #所需列名
trans_data = cc[data_name]  #新列名组成表格
all_hyk= [list(trans_data.ix[i].values)+[1,shopId+day] for i in range(0, all_row)] #
all_info = [(re.findall("(\d+);", str(i[0]))[0], i[1], i[2], i[3], i[4], i[5], i[6])  if ';' in str(
    i[0]) else tuple(i) for i in all_hyk]
b = "%s" % (all_info)
all_hyk = eval(b)
print(all_hyk)
all_info =[(re.findall("(\d+);",str(i[0]))[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9]) if ';' in str(i[0]) else tuple(i) for i in all_lx+all_sxk+all_hpjs +all_hyk+all_yrxs+all_bfsg]

pandas处理源文件一定要另存为

def handle_csv(xls_name,day,shopid):
    """
    处理解压后的csv,提取数据
    :return:
    """
    print(xls_name)
    df = pd.read_csv(xls_name,encoding="gbk")
    df['dateTime'] = day
    df['shopId'] = shopid
    df['佣金比例'] = df['佣金比例'].str.strip('%').astype(float)/100
    df['服务费率'] = df['服务费率'].str.strip('%').astype(float)/100
    a = df.fillna(0)  #处理nan数据
    all_column = df.shape[1]  # 读取列数
    all_row = a.shape[0]  # 读取行数
    colunmName = df.columns.values #读取表头

    a =[tuple(a.ix[i].values) for i in range(0, all_row)]
    #a = [(list(df.ix[i].values)[0], list(df.ix[i].values)[8],1, erpId,day) for i in range(0, all_row)] #读取第一列和第9列的数据


    b = "%s"%(a)
    alimama_info = eval(b)

    os.remove(xls_name)

    return alimama_info

其中,encoding='gb2312'处理csv中文乱码问题;str.strip('%').astype(float)/100处理百分号;
df['dateTime'] = day添加一列dateTime都为day的列;

对表中的nan处理 一定要在所有数据处理完成后在进行处理,且进行浅拷贝另行保存。

对于格式标准的csv文件读取表头可以直接使用colunmName = df.columns.values读取表头信息,对于表头在另外的行数,如第5行可以使用list(df.ix[4].values)读取列名,读取的dataFrame需要转为python的列表来处理。

对于处理csv中大量的numpy.int64类型数据,由于无法直接保存到sql里,需要进行转换,
sql报错ValueError: expected a simple type, a tuple or a list

b = "%s"%(a)  #列表转为字符串
alimama_info = eval(b) #eval成为python列表

    sql_dic = {'流量来源': 'source', '来源明细': 'sourceName', '访客数': 'uv', '访客数环比': 'uv2', '新访客': 'newUv', '新访客变化': 'newUv2',
               '浏览量': 'pv', '浏览量变化': 'pv2', '人均浏览量': 'avgPv', '人均浏览量变化': 'avgPv2', '收藏人数': 'cltCnt',
               '收藏人数变化': 'cltCnt2', '加购人数': 'cartByrCnt', '加购人数变化': 'cartByrCnt2', '跳失率': 'bounceRate',
               '跳失率变化': 'bounceRate2', '下单金额': 'crtVldAmt', '下单金额变化': 'crtVldAmt2', '下单买家数': 'crtByrCnt',
               '下单买家数变化': 'crtByrCnt2', '下单转化率': 'crtRate', '下单转化率变化': 'crtRate2', '支付金额': 'payAmt',
               '支付金额变化': 'payAmt2', '支付买家数': 'payByrCnt', '支付买家数变化': 'payByrCnt2', '支付转化率': 'payRate',
               '支付转化率变化': 'payRate2', '客单价': 'payPct', '客单价变化': 'payPct2', 'UV价值': 'uvValue', 'uv价值变化': 'uvValue2',
               '直接支付买家数': 'directPayByrCnt', '收藏商品-支付买家数': 'cltItmPayByrCnt', '粉丝支付买家数': 'fszfmjs',
               '加购商品-支付买家数': 'ordItmPayByrCnt','来源':'source','访客数变化':'uv2','关注店铺买家数':'gzdpmjs','关注店铺买家数变化':'gzdpmjs2',
               '收藏商品买家数':'scspmjs','收藏商品买家数变化':'scspmjs2'
               }

    # 插入pc流量数据
    df = pd.read_excel(xls_name)
    all_column = df.shape[1]  # 读取列数
    all_row = df.shape[0]  # 读取行数
    col_name = list(df.ix[4].values)  # 读取列名
    #col_name =list(df.columns)
    print(col_name)
    all_data = []  # 所有数据
    for i in range(5, all_row):
    
        # data2 = df.ix[i].values
        new_list = list(df.ix[i].values)  #将每列数据转为列表形式

        # new_dic = dict(zip(data1, data2))  # 转为字典
        # new_list = [value for value in new_dic.values()]  # 转为列表
        new_data = []
        for i in new_list:
            if '%' in i:
                uv = round(float(i.strip('%')) / 100, 4)
                new_data.append(uv)
            elif ',' in i:
                uv = i.replace(',', '')
                new_data.append(uv)
            elif i == '-':
                new_data.append(0)
            else:
                uv = i
                new_data.append(uv)

        all_data.append(tuple([port, shopid, mon, inTime] + new_data))
    print(all_data)
    sql_field = ['typeId', 'shopId', 'dateTime', 'inTime'] + [sql_dic.get(i) for i in col_name]  # 根据列名生成对应sql字段
    print(sql_field)
    sss = tuple([ '%s' for i in range(len(sql_field))])   #生成%s

    sql = "INSERT INTO oprLLLY_Month %s VALUES %s" % (tuple(sql_field), sss)
    new_sql = sql.replace("'", '')   #生成批量写入的sql语句
    print(new_sql)

    cursor.executemany(new_sql, all_data)
    conn.commit()
    cursor.close()
    conn.close()

    os.remove(xls_name)

相关文章

网友评论

      本文标题:pandas处理csv,根据列名取数

      本文链接:https://www.haomeiwen.com/subject/hxbcoctx.html