如何在多个条件下使用pd.read.csv()读取非常混乱的.txt文件

时间:2019-05-16 08:34:07

标签: pandas

我有一个非常混乱的.txt文件,尝试使用pd.read_csv()读取。该文件有许多要克服的挑战:1)不需要前12行,因此需要跳过,接下来的50行,需要跳过的下14行,接下来的50行,需要跳过的14行,等等。 2)在此报表中,每个普通数据行实际上跨2行数据存在,这意味着我们需要将第二行数据提升到第一行数据并将其放在新列的右侧。 (此操作将使所需数据帧的总行数减半,并使列数加倍)3)最后一个挑战是,第一行数据的值之间有8个空格分隔,而第二行数据的值在8之外。值之间的Sep到17个空格。

我认为最好的方法是先删除不需要的行。然后,我将找到将第1行与第2行/第3行与第4行/第5行与第6行合并的方法,直到正确合并所有行。然后,我将使用'sep'函数将具有8个及以上空格的任何内容的每一行的值分开。希望这能达到我期望的输出-是否有人曾经遇到过类似的挑战?

第一张图片是原始数据enter image description here

的图片

第二张图片是我的理想输出enter image description here

1 个答案:

答案 0 :(得分:0)

好的,所以error_bad_lines = False加上sep ='\ s + | \ ^ +'可以解决问题。

然后我通过逐行删除不良行来解决问题。 然后,我通过将数据帧分为两个df(df8,df9)并在axis = 1上重新组合来解决“ 1行超过2行”的问题。现在看起来很完美。

import pandas as pd     #importing Pandas Package to wrangle data

boltcogs = 'ABAPlist.txt'

df = pd.read_csv(boltcogs,skiprows=12,error_bad_lines=False,header = None ,sep = '\s+|\^+')

df1 = df[df.iloc[:,0] != 'Production' ]  ## removing verbose lines
df2 = df1[df1.iloc[:,0] != '----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------' ]
df3 = df2[df2.iloc[:,0] != 'Kuala' ] ## removing bad rows
df4 = df3[df3.iloc[:,0] != 'Operating' ] ## removing bad rows
df5 = df4[df4.iloc[:,0] != 'Plant:' ] ## removing bad rows
df6 = df5[df5.iloc[:,0] != 'Costing' ] ## removing bad rows
df7 = df6[df6.iloc[:,0] != 'Currency:' ] ## removing bad rows

df8 = df7.iloc[0::2, :].reset_index() # Selecting every second row to get second half of row
df9 = df7.iloc[1::2, :].reset_index()# Selecting remainder to to get first half of row

df10 = pd.concat([df8, df9], axis=1, ignore_index=True) # joining them together