Python csv列值转到新行,导致在中加载错误
我对csv有一个问题,它在一个列中有一个拆分,并转到一个新行。我可以手动编辑.csv来解决这个问题,但是有大约200个文件 数据集包含更多列,并且可以包含null,但是最后一列始终具有值。每次该问题也仅在同一列中出现。因此,我考虑查找最后一个值何时为null,然后尝试用.shift()填充这些值,但希望找到一种更简单的方法 vscode中的视图 熊猫阅读 通缉纵队 修复您的文件:Python csv列值转到新行,导致在中加载错误,python,pandas,csv,text-processing,Python,Pandas,Csv,Text Processing,我对csv有一个问题,它在一个列中有一个拆分,并转到一个新行。我可以手动编辑.csv来解决这个问题,但是有大约200个文件 数据集包含更多列,并且可以包含null,但是最后一列始终具有值。每次该问题也仅在同一列中出现。因此,我考虑查找最后一个值何时为null,然后尝试用.shift()填充这些值,但希望找到一种更简单的方法 vscode中的视图 熊猫阅读 通缉纵队 修复您的文件: 使用m=re.findall(')(?修复文件: 使用m=re.findall(')(?溶液 下面是另一个解决方
- 使用
m=re.findall(')(?修复文件:
- 使用
”,“m=re.findall(')(?溶液 下面是另一个解决方案: 这里的逻辑是首先找到以4位数字开头的行 B.识别行后,任何行(顶部行除外:标题行)
- 没有以4位数字开头的,以及
- 没有三个分隔的“
- 使用
io.StringIO
作为数据帧加载此字符串
示例-1
将熊猫作为pd导入
从io导入StringIO
进口稀土
def get_clean_数据(行):
target_lines=[re.findall('^\d{4}',line)表示行中的行]
target_lines_dict=dict((i,val[0])如果(len(val)>0)枚举(target_lines)中i,val的else(i,None)
正确的_行=列表()
行索引=0
对于i,枚举中的行(行):
如果i==0:
更正\u行。追加(line.strip())
如果i>0:
如果target_line_dict[i]不是None:
更正\u行。追加(line.strip())
行索引+=1
其他:
正确的行[行索引]+=''+行.strip()
正确的_行=[re.sub(',\s*',','行)+'\n'用于正确的_行中的行]
ss=''。连接(正确的线)
返回ss
#虚拟数据
s=”“”
医嘱ID、水果、计数、人员
3523,苹果,84,彼得
2522,绿色
葡萄,99,玛丽
1299,西瓜,93,保罗
"""
lines=s.strip().split('\n')
#如果是csv文件,请使用readlines:
#将open('csv_file.csv','r')作为f:
#行=f.读行()
#清除数据
ss=获取数据(行)
#生成数据帧
df=pd.read_csv(StringIO(ss),sep=',')
打印(df)
输出:
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
3 3523 apple 84 peter
4 2522 green banana 99 mary
5 1299 watermelon 93 paul
6 3523 apple 84 peter
7 2522 green apple 99 mary
8 1299 watermelon 93 paul
示例2
现在让我们使用以下虚拟数据
s=”“”
医嘱ID、水果、计数、人员
3523,苹果,84,彼得
2522,绿色
葡萄,99,玛丽
1299,西瓜,93,保罗
3523,苹果,84,彼得
2522,绿色
香蕉,99,玛丽
1299,西瓜,93,保罗
3523,苹果,84,彼得
2522,绿色
苹果,99岁,玛丽
1299,西瓜,93,保罗
"""
输出:
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
3 3523 apple 84 peter
4 2522 green banana 99 mary
5 1299 watermelon 93 paul
6 3523 apple 84 peter
7 2522 green apple 99 mary
8 1299 watermelon 93 paul
解决方案
下面是另一个解决方案:
这里的逻辑是首先找到以4位数字开头的行
B.识别行后,任何行(顶部行除外:标题行)
- 没有以4位数字开头的,以及
- 没有三个分隔的“”,“
io.StringIO
作为数据帧加载此字符串
示例-1
将熊猫作为pd导入
从io导入StringIO
进口稀土
def get_clean_数据(行):
target_lines=[re.findall('^\d{4}',line)表示行中的行]
target_lines_dict=dict((i,val[0])如果(len(val)>0)枚举(target_lines)中i,val的else(i,None)
正确的_行=列表()
行索引=0
对于i,枚举中的行(行):
如果i==0:
更正\u行。追加(line.strip())
如果i>0:
如果target_line_dict[i]不是None:
更正\u行。追加(line.strip())
行索引+=1
其他:
正确的行[行索引]+=''+行.strip()
正确的_行=[re.sub(',\s*',','行)+'\n'用于正确的_行中的行]
ss=''。连接(正确的线)
返回ss
#虚拟数据
s=”“”
医嘱ID、水果、计数、人员
3523,苹果,84,彼得
2522,绿色
葡萄,99,玛丽
1299,西瓜,93,保罗
"""
lines=s.strip().split('\n')
#如果是csv文件,请使用readlines:
#将open('csv_file.csv','r')作为f:
#行=f.读行()
#清除数据
ss=获取数据(行)
#生成数据帧
df=pd.read_csv(StringIO(ss),sep=',')
打印(df)
输出:
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
3 3523 apple 84 peter
4 2522 green banana 99 mary
5 1299 watermelon 93 paul
6 3523 apple 84 peter
7 2522 green apple 99 mary
8 1299 watermelon 93 paul
示例2
现在让我们使用以下虚拟数据
s=”“”
医嘱ID、水果、计数、人员
3523,苹果,84,彼得
2522,绿色
葡萄,99,玛丽
1299,西瓜,93,保罗
3523,苹果,84,彼得
2522,绿色
香蕉,99,玛丽
1299,西瓜,93,保罗
3523,苹果,84,彼得
2522,绿色
苹果,99岁,玛丽
1299,西瓜,93,保罗
"""
输出:
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
orderid fruit count person
0 3523 apple 84 peter
1 2522 green grape 99 mary
2 1299 watermelon 93 paul
3 3523 apple 84 peter
4 2522 green banana 99 mary
5 1299 watermelon 93 paul
6 3523 apple 84 peter
7 2522 green apple 99 mary
8 1299 watermelon 93 paul
*编辑、vscode和记事本++显示类似的结果。您是如何获得此CSV的?如果您使用python
open()
,write()
创建它,那么您应该使用模块CSV
,该模块应使用编写绿色葡萄
在文件中创建正确的csv数据。然后熊猫会正确读取它。遗憾的是,他们是这样下载的…我没有创建它们。我添加了一个部分,以便从所有csv文件中轻松创建数据帧。*编辑、vscode和记事本++显示类似的结果。您是如何获得此csv的?如果您使用pythonopen(),write()
然后您应该使用模块csv
,该模块应该用编写绿葡萄
“
来创建正确的c