我有一个(坏的)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
我想创建一个包含所有行但忽略任何“额外”列值的数据框,因此它将使用行model
,height
和{{1 }},但分别忽略第3、4、6和6行上的strength
,88
,29
和200
的值。
我可以使用0.8
中的error_bad_lines=False
处理特定的行,但这只是忽略了那些我不想做的行。
那么熊猫有办法做到这一点吗?
感谢您的帮助
答案 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
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