将包含许多表的 txt 文件拆分为单个数据框
Splitting a txt file with many tables to a single dataframe
我有一个从网站下载的 txt 文件。此 txt 文件有许多观察结果和不同的 tables.
例如:
Table 1
"{'ID':'1','Column A':'Observation A', 'Column B':'Observation B',...}"
"{'ID':'2','Column A':'Observation G', 'Column C':'Observation E',...}"
Table 2
"{'ID':'3', 'Column A':'Observation I', 'Column C': Observation B',...}"
"{'ID':'4','Column I':'Observation A', 'Column B':'Observation B',...}"
我想做的是打开文件,将数据拆分为不同的观察结果,尽管在它们的列下列出了观察结果。如果一个ID没有列,但该列出现在之前的ID中,则该列下的观察应列为N/A或0。否则,如果之前没有出现过的列,则将其添加为新列并用 0 或 N/A 填充之前没有此列的 ID 的观察结果。一个例子,考虑到上面的 table 演示,将是:
'ID','Column A','Column B','Column C', 'Column I'
'3', 'I' ,'N/A' , 'B' , 'N/A'
目前我已经用open(str)
加载并读取了数据以打开文件。使用 Regex 将数据拆分为多个观察值,然后开发一个数据框,尽管最终只有 1 列,每行包含每个 ID 的所有数据。我想过使用正则表达式使用定界符进一步拆分,然后遍历每个 ID 的所有奇数,以便识别和附加(通过使用 .extend 方法)每个 ID 的列列表(可能属于任何 table)。但是,如果有带逗号分隔符的观测值,此方法将导致错误。
有没有更好的方法来解决这个问题?
我找到了解决办法。
作为第一步,我使用不会丢弃任何数据的编码打开 txt 文件,包括不同的语言或符号,如 in-built functions of python here 中所述。
with open ('sample.txt', 'r', encoding='UTF-8') as file:
dataoftxt = file.read().replace('\n', '')
之后我使用 regular expressions 来拆分数据并将代码与观察结果分开。由于数据的性质,我选择了 ':'
和 ',"'
作为分隔符,这样我就可以将列名与观察值分开。由于 table 的常见结构总是首先列出列的名称,然后列出观察值,因此拆分将所有列分隔为奇数(即 1 Column_name、2 值、3 Column_name...)。使用 temp.iloc
我设法只提取列的数据,然后执行 .drop_duplicate
函数删除由于 ID 数量不同而多次出现的列。
import re
column_names = pd.DataFrame(re.split(':|,"', dataoftxt))
column_names[0] = temp.iloc[1::2] #takes only the odd numbers of the column 0
column_names = column_names.reset_index(drop=True) #resets the index
column_names = column_names.drop_duplicates().reset_index(drop=True) #remove duplicate columns
执行代码后,我使用 print(column_names.to_string)
手动检查数据,并根据某些规定删除任何不符合列条件的列。
我有一个从网站下载的 txt 文件。此 txt 文件有许多观察结果和不同的 tables.
例如:
Table 1
"{'ID':'1','Column A':'Observation A', 'Column B':'Observation B',...}"
"{'ID':'2','Column A':'Observation G', 'Column C':'Observation E',...}"
Table 2
"{'ID':'3', 'Column A':'Observation I', 'Column C': Observation B',...}"
"{'ID':'4','Column I':'Observation A', 'Column B':'Observation B',...}"
我想做的是打开文件,将数据拆分为不同的观察结果,尽管在它们的列下列出了观察结果。如果一个ID没有列,但该列出现在之前的ID中,则该列下的观察应列为N/A或0。否则,如果之前没有出现过的列,则将其添加为新列并用 0 或 N/A 填充之前没有此列的 ID 的观察结果。一个例子,考虑到上面的 table 演示,将是:
'ID','Column A','Column B','Column C', 'Column I'
'3', 'I' ,'N/A' , 'B' , 'N/A'
目前我已经用open(str)
加载并读取了数据以打开文件。使用 Regex 将数据拆分为多个观察值,然后开发一个数据框,尽管最终只有 1 列,每行包含每个 ID 的所有数据。我想过使用正则表达式使用定界符进一步拆分,然后遍历每个 ID 的所有奇数,以便识别和附加(通过使用 .extend 方法)每个 ID 的列列表(可能属于任何 table)。但是,如果有带逗号分隔符的观测值,此方法将导致错误。
有没有更好的方法来解决这个问题?
我找到了解决办法。
作为第一步,我使用不会丢弃任何数据的编码打开 txt 文件,包括不同的语言或符号,如 in-built functions of python here 中所述。
with open ('sample.txt', 'r', encoding='UTF-8') as file:
dataoftxt = file.read().replace('\n', '')
之后我使用 regular expressions 来拆分数据并将代码与观察结果分开。由于数据的性质,我选择了 ':'
和 ',"'
作为分隔符,这样我就可以将列名与观察值分开。由于 table 的常见结构总是首先列出列的名称,然后列出观察值,因此拆分将所有列分隔为奇数(即 1 Column_name、2 值、3 Column_name...)。使用 temp.iloc
我设法只提取列的数据,然后执行 .drop_duplicate
函数删除由于 ID 数量不同而多次出现的列。
import re
column_names = pd.DataFrame(re.split(':|,"', dataoftxt))
column_names[0] = temp.iloc[1::2] #takes only the odd numbers of the column 0
column_names = column_names.reset_index(drop=True) #resets the index
column_names = column_names.drop_duplicates().reset_index(drop=True) #remove duplicate columns
执行代码后,我使用 print(column_names.to_string)
手动检查数据,并根据某些规定删除任何不符合列条件的列。