标记数据时出错。 C错误:第j行中应有n个字段,忽略了多余的列,从而解决了k个问题?

时间:2019-06-05 03:05:03

标签: python pandas dataframe

我有一个(坏的)csv文件,看起来像这样:

model, height, strength
1, 124.5, 63
2, 160.4, 85
3, 144.6, 94, 88
4, 122.5, 36, 29
5, 132, 22
6, 140.6, 46, 200, 0.8

我想创建一个包含所有行但忽略任何“额外”列值的数据框,因此它将使用行modelheight和{{1 }},但分别忽略第3、4、6和6行上的strength8829200的值。

我可以使用0.8中的error_bad_lines=False处理特定的行,但这只是忽略了那些我不想做的行。

那么熊猫有办法做到这一点吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

这是一种方法:

使用任何其他分隔符读取文件:

df = pd.read_csv(pd.compat.StringIO("""model, height, strength
1, 124.5, 63
2, 160.4, 85
3, 144.6, 94, 88
4, 122.5, 36, 29
5, 132, 22
6, 140.6,46, 200, 0.8"""),sep='|')

方法1 : 根据逗号分割值,并在axis=1

上创建新的df和dropna
m=df.iloc[:,0].str.split(',',expand=True).dropna(axis=1)
m.columns=df.columns.str.split(',').tolist()
print(m)

  model  height  strength
0     1   124.5        63
1     2   160.4        85
2     3   144.6        94
3     4   122.5        36
4     5     132        22
5     6   140.6        46

方法2 :使用sep='|'

阅读后
cols=df.columns.str.split(',')[0]
df=pd.DataFrame(df.iloc[:,0].str.split(',').str[:len(cols)].values.tolist(),columns=cols)

  model  height  strength
0     1   124.5        63
1     2   160.4        85
2     3   144.6        94
3     4   122.5        36
4     5     132        22
5     6   140.6        46

答案 1 :(得分:2)

我将使用

from pandas.compat import StringIO
dat = """model, height, strength
1, 124.5, 63
2, 160.4, 85
3, 144.6, 94, 88
4, 122.5, 36, 29
5, 132, 22
6, 140.6, 46, 200, 0.8"""
df = pd.read_csv(StringIO(dat), sep=',',header=None,names=range(1,10))
df=df.iloc[:,:3].T.set_index(0).T
df
0 model  height  strength
1     1   124.5        63
2     2   160.4        85
3     3   144.6        94
4     4   122.5        36
5     5     132        22
6     6   140.6        46