在 Pandas 中使用逗号和字符读取 CSV 文件的问题的扩展
当且仅当一列包含逗号作为其字符且其余列表现良好时,上述链接中提供的解决方案才有效。
如果有不止一列有上述问题怎么办?
带有附加逗号问题的 CSV 内容示例:
Name,Age,Address,Phone,Qualification
Suresh,28,Texas,3334567892,B.Tech
Ramesh,24,NewYork, NY,8978974040,9991111234,Ph.D
Mukesh,26,Dallas,4547892345,Ph.D
所需的输出 Pandas 数据帧:
Name Age Address Phone Qualification
Suresh 28 Texas 3334567892 B.Tech
Ramesh 24 NewYork, NY 8978974040,9991111234 Ph.D
Mukesh 26 Dallas 4547892345 Ph.D
编辑:
在连续列中以逗号作为字符的输入文件:
Name,Age,Address,Qualification,Grade
Suresh,28,Texas,B.Tech,Ph.D,A
Ramesh,24,NewYork, NY,B.Tech,A+
Mukesh,26,Dallas,B.Tech,Ph.D,A
所需的输出 Pandas 数据帧:
Name Age Address Qualification Grade
Suresh 28 Texas B.Tech,Ph.D A
Ramesh 24 NewYork, NY B.Tech A+
Mukesh 26 Dallas B.Tech,Ph.D A
我能得到解决这个问题的任何建议吗?
提前致谢!!!
您的前两列和最后一列的数据看起来都是固定的,因此可以删除这些数据,并且可以使用itertools.groupby()
将剩余的列分组为数字或非数字组来处理剩余值。然后可以将结果数据加载到熊猫中:
import pandas as pd
from itertools import groupby
import csv
data = []
with open('input.csv', newline='') as f_input:
csv_input = csv.reader(f_input)
header = next(csv_input)
for row in csv_input:
addr_phone = [','.join(g) for k, g in groupby(row[2:-1], lambda x: x.isdigit())]
data.append(row[:2] + addr_phone + [row[-1]])
df = pd.DataFrame(data, columns=header)
print(df)
给你:
Name Age Address Phone Qualification
0 Suresh 28 Texas 3334567892 B.Tech
1 Ramesh 24 NewYork, NY 8978974040,9991111234 Ph.D
2 Mukesh 26 Dallas 4547892345 Ph.D
要使用第二个示例,您必须决定拆分两列的方法。我建议您创建一个可能的资格列表。当有比赛时,你可以在那个时候分裂。例如:
import pandas as pd
import csv
def find_split(data):
for index, v in enumerate(data):
if v.lower() in ['b.tech', 'ph.d']:
return [', '.join(data[:index]), ', '.join(data[index:])]
return [', '.join(data), '']
data = []
with open('input.csv', newline='') as f_input:
csv_input = csv.reader(f_input, skipinitialspace=True)
header = next(csv_input)
for row in csv_input:
data.append(row[:2] + find_split(row[2:-1]) + [row[-1]])
df = pd.DataFrame(data, columns=header)
print(df)
给你:
Name Age Address Qualification Grade
0 Suresh 28 Texas B.Tech, Ph.D A
1 Ramesh 24 NewYork, NY B.Tech A+
2 Mukesh 26 Dallas B.Tech, Ph.D A
您可以首先set()
根据row[2]
(小写)的内容创建一个资格列表。打印集合的内容,然后将其添加到脚本中并重新运行它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句