Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python csv中处理标题为行的数据_Python_Python 2.7_Csv_Pandas - Fatal编程技术网

在python csv中处理标题为行的数据

在python csv中处理标题为行的数据,python,python-2.7,csv,pandas,Python,Python 2.7,Csv,Pandas,我有一个csv文件,第一行有产品名称,第二行有数据头,从第三行开始包含每个用户状态的实际数据 csv文件如下所示: adidas,, USER_ID,USER_NAME b012345,zaihan,Process b212345,nurhanani,Check b843432,nasirah,Call b712345,ibrahim,Check nike,, USER_ID,USER_NAME b842134,khalee,Call h123455,shabree,Process b77734

我有一个csv文件,第一行有产品名称,第二行有数据头,从第三行开始包含每个用户状态的实际数据

csv文件如下所示:

adidas,,
USER_ID,USER_NAME
b012345,zaihan,Process
b212345,nurhanani,Check
b843432,nasirah,Call
b712345,ibrahim,Check
nike,,
USER_ID,USER_NAME
b842134,khalee,Call
h123455,shabree,Process
b777345,ibrahim,Process
b012345,zaihan,Check
b843432,nasirah,Call
b312451,nurhanani,Process
index = df1.index[df1['adidas'] == 'nike'].tolist()[0]
df2 = df1[index:]
df1 = df1[:index]
我希望按如下方式拆分数据产品并重新排列标题和数据:

adidas,,
USER_ID,USER_NAME
b012345,zaihan,Process
b212345,nurhanani,Check
b843432,nasirah,Call
b712345,ibrahim,Check
nike,,
USER_ID,USER_NAME
b842134,khalee,Call
h123455,shabree,Process
b777345,ibrahim,Process
b012345,zaihan,Check
b843432,nasirah,Call
b312451,nurhanani,Process
index = df1.index[df1['adidas'] == 'nike'].tolist()[0]
df2 = df1[index:]
df1 = df1[:index]
从这样的标题开始

   adidas,,
   USER_ID,USER_NAME
   b012345,zaihan,Process
  USER_ID,USER_NAME,adidas
  b012345,zaihan,Process
这样的标题

   adidas,,
   USER_ID,USER_NAME
   b012345,zaihan,Process
  USER_ID,USER_NAME,adidas
  b012345,zaihan,Process
并创建每种产品的名称和名称,如下所示:

adidas,,
USER_ID,USER_NAME
b012345,zaihan,Process
b212345,nurhanani,Check
b843432,nasirah,Call
b712345,ibrahim,Check
nike,,
USER_ID,USER_NAME
b842134,khalee,Call
h123455,shabree,Process
b777345,ibrahim,Process
b012345,zaihan,Check
b843432,nasirah,Call
b312451,nurhanani,Process
index = df1.index[df1['adidas'] == 'nike'].tolist()[0]
df2 = df1[index:]
df1 = df1[:index]

我写代码已经有一段时间了,我想我必须硬编码标题(例如,“阿迪达斯”和“耐克”),因为我从阅读中了解到答案是,我需要唯一的标题名称,而以下代码没有得到我想要的:

我的python代码是:

import csvkit
import sys
import os
from csvkit import convert

with open('/tmp/csvdata.csv', 'rb') as q:
    reader = csvkit.reader(q)
    with open('/tmp/csvdata2.csv', 'wb') as s:
        data = csvkit.writer(s)
        data.writerow(['Name', 'Userid', 'adidas', 'nike'])
        for row in reader:
            row_data = [row[0], row[1], row[2], '']
            data = csvkit.writer(s)
            data.writerow(row_data)
编辑

所以我从@piRSquared得到了一个解决方案,如果一个产品有一组唯一的记录,这是正确的,但是对于同一个产品,每个用户可能有多个状态。解决方案给出了
ValueError:索引包含重复的条目,无法重新塑造

具有多个状态并将导致此问题的输入CSV数据示例:

adidas,,
USER_ID,USER_NAME
b012345,zaihan,Process
h003455,shabree,Check
b212345,nurhanani,Check
b843432,nasirah,Call
b712345,ibrahim,Check
b712345,ibrahim,Process
nike,,
USER_ID,USER_NAME
b842134,khalee,Call
h123455,shabree,Process
b777345,ibrahim,Process
b012345,zaihan,Check
b843432,nasirah,Call
b312451,nurhanani,Process
我希望达到这样的结果,似乎同一品牌类别的用户可以拥有相同的id、名称以及流程和检查

USER_ID,USER_NAME,adidas,nike
b012345,zaihan,Process
h003455,shabree,Check,Process
b212345,nurhanani,Check,Process
b843432,nasirah,Call,Call
b712345,ibrahim,Check
b712345,ibrahim,Process 
b777345,ibrahim,,Process
b842134,khalee,,Call

对于在同一品牌中同时进行检查和处理的用户(在本例中,nike brand中的用户易卜拉欣)而言,最终结果应具有如上所述的附加行。

也许这有帮助,您可以使用Pandas合并两个数据集

import pandas as pd
df1 = pd.read_csv("csvdata.csv")
df2 = pd.read_csv("csvdata2.csv")

df3 = df1.merge(df2, on='USER_ID', how='left')
df3 = df3[['USER_ID', 'USER_NAME', 'NIKE', 'ADIDAS']]

print df3
您应该更改数据,使其包含Nike/Adidas的标题,删除of中的所有标题,并使用Pandas编写标题,就像您在原始代码中所做的那样:

df1 = pd.read_csv("csvdata.csv", names = ['USER_ID', 'USER_NAME', 'NIKE'])

重命名您的标题:

USER_ID,USERNAME,NIKE

b842134,khalee,Call

h123455,shabree,Process

b712345,ibrahim,Process

c143322,zaihan,Check

b843432,nasirah,Call
编辑: 如果数据位于一个文件中,可以尝试将其拆分为两个数据帧,如下所示:

adidas,,
USER_ID,USER_NAME
b012345,zaihan,Process
b212345,nurhanani,Check
b843432,nasirah,Call
b712345,ibrahim,Check
nike,,
USER_ID,USER_NAME
b842134,khalee,Call
h123455,shabree,Process
b777345,ibrahim,Process
b012345,zaihan,Check
b843432,nasirah,Call
b312451,nurhanani,Process
index = df1.index[df1['adidas'] == 'nike'].tolist()[0]
df2 = df1[index:]
df1 = df1[:index]

这有点草率,但应该能用…

好的,这很复杂

解决方案 示范 解释
首先,
Ctrl+C
编辑您的示例数据并尝试在下面运行

import pandas as pd
import numpy as np

df = pd.read_clipboard(header=None)

i = np.where(~df[0].str.contains(','))[0].astype(int).tolist()+[len(df)]

frames = []
for n in range(len(i))[:-1]:
    part = df.iloc[i[n]:i[n+1]]
    part_df = part.iloc[2:, 0].str.extract('(.+),(.+),(.+)')
    part_df.columns = ['USER_ID', 'USER_NAME', '{}'.format(part.iloc[0, 0])]
    frames.append(part_df.set_index(['USER_ID', 'USER_NAME']))

final = pd.concat(frames, axis=1).fillna('')
final.to_csv('result.csv')
结果是,

USER_ID,USER_NAME,adidas,nike
b012345,zaihan,Process,
b212345,nurhanani,Check,
b451234,nasirah,Call,
b712345,ibrahim,,Process
b842134,khalee,,Call
b843432,nasirah,,Call
c143322,zaihan,,Check
c234567,ibrahim,Check,
h123455,shabree,,Process

你的问题是什么?你真的有用户名和用户名吗?很抱歉,假设是UsRyNAMECAN,我们总是认为标题是大写的。是的,我想我可以写另一个Python脚本来把“阿迪达斯”和“NIKE”作为大写,这是一个硬代码,找到并替换它。有一个CSV,这就是问题的重点好吧,对不起,我没有意识到你的答案是正确的。另一个问题是,如果标题像
adidas、、
nike、、
(即带有逗号),该如何处理?如果我有这样的格式?我会尝试让正则表达式匹配任何带有空逗号的内容,
,并发布结果。我想我可以检查任何非空逗号,即使用
b842134,khalee,呼叫
,根据该正则表达式,我可以知道它不是
nike
adidas
抱歉,它应该是
而不是
,,,
我添加了尾随的逗号。我还调整了输入文本,以显示当阿迪达斯和耐克都显示相同的用户id和名称时,该文本将如何工作。我已编辑了我关于一些错误的问题。我确实尝试了df.groupby(level=0),但我仍然有
ValueError:索引包含重复的条目,无法重新塑造