如何使用 numpy 将文本文件细分为几个单独的数组



我有一个文本文件,我想根据其中一行中的值将其细分为 3 个单独的文本文件。如果 LineID 为 1,我想将该 LineID 的所有行移动到单独的数组甚至单独的文本文件中。

文本文件输出:

Num  LineID  ColA  ColB ColC
1 1 7 3.5 89.9
1 2 6.8 3.1 90.02
1 3 7.5 2.9 90
2 1 7.2 3.2 92
2 2 7.1 3.1 89.8
2 3 6.9 2.87 88
3 1 7.3 2.9 90
3 2 7.03 3.04 90
3 3 7.2 3 89.6

我想根据 LineID 值将其分成三个单独的数组或文本文件。

行 ID 的第一个数组 = 1

Num  LineID  ColA  ColB ColC
1 1 7 3.5 89.9
2 1 7.2 3.2 92
3 1 7.3 2.9 90

行 ID = 2 的第二个数组

Num  LineID  ColA  ColB ColC
1 2 6.8 3.1 90.02
2 2 7.1 3.1 89.8
3 2 7.03 3.0 4 90

行 ID = 3 的第三个数组

Num  LineID  ColA  ColB ColC
1 3 7.5 2.9 90
2 3 6.9 2.87 88
3 3 7.2 3 89.6

有没有人有任何关于如何在python或Numpy/Pandas中做到这一点的指示?

Ivan提供了一个很好的解决方案,我还没有全部检查它们,它只是在每行的开头添加一个额外的数字,对应于该行在原始数组/文本文件中的原始位置。我已经尝试过使用","和"分隔的csv和空格分隔的txt文件,结果相同。

Num  LineID  ColA  ColB  CoLC
0    1       1   7.0   3.5  89.9
3    2       1   7.2   3.2  92.0
6    3       1   7.3   2.9  90.0
Num  LineID  ColA  ColB   CoLC
1    1       2  6.80  3.10  90.02
4    2       2  7.10  3.10  89.80
7    3       2  7.03  3.04  90.00
Num  LineID  ColA  ColB  CoLC
2    1       3   7.5  2.90  90.0
5    2       3   6.9  2.87  88.0
8    3       3   7.2  3.00  89.6

根据您的文本文件将被命名为example.txt,内容如下:

Num  LineID  ColA  ColB ColC
1 1 7 3.5 89.9
1 2 6.8 3.1 90.02
1 3 7.5 2.9 90
2 1 7.2 3.2 92
2 2 7.1 3.1 89.8
2 3 6.9 2.87 88
3 1 7.3 2.9 90
3 2 7.03 3.04 90
3 3 7.2 3 89.6

您可以使用 pandas 将其导入为数据帧:

import pandas as pd
df = pd.read_csv('example.txt', sep=' ')

然后,您可以根据行 ID 进行筛选:

df1 = df[df.LineID == 1]
...

这应该有帮助,id1、id2 和 id3 有你需要的东西,你可以稍后用它们各自写一个文件。

import pandas as pd
data = pd.read_csv('textfile.txt', sep=" ")
id1 = data[data['LineID'] == 1]
id2 = data[data['LineID'] == 2]
id3 = data[data['LineID'] == 3]
print(id1)
print(id2)
print(id3)

groupbyto_csv

  • 请务必包含选项index=False,以指示您不希望在输出中包含索引。
  • 请不要手动搜索每个唯一'LineID',并按等于该值的内容对DataFrame进行子集。 使用groupby
  • 此外,您可以非常优雅地循环访问groupby对象,如字典。这是我在下面所做的。

for lid, grp in df.groupby('LineID'):
grp.to_csv(f'text_{lid}.csv', index=False, sep=' ')

验证

from pathlib import Path
for fp in Path('.').glob('text_*.csv'):
print(fp)
print('-' * 80)
print(open(fp).read())
print()
text_1.csv
--------------------------------------------------------------------------------
Num LineID ColA ColB ColC
1 1 7.0 3.5 89.9
2 1 7.2 3.2 92.0
3 1 7.3 2.9 90.0

text_2.csv
--------------------------------------------------------------------------------
Num LineID ColA ColB ColC
1 2 6.8 3.1 90.02
2 2 7.1 3.1 89.8
3 2 7.03 3.04 90.0

text_3.csv
--------------------------------------------------------------------------------
Num LineID ColA ColB ColC
1 3 7.5 2.9 90.0
2 3 6.9 2.87 88.0
3 3 7.2 3.0 89.6

dictDataFrame'LineID'

dict_of_df_by_lid = dict((*df.groupby('LineID'),))
# Less Obtuse
# dict_of_df_by_lid = {k: v for k, v in df.groupby('LineID')}

验证

for k, v in dict_of_df_by_lid.items():
print(f'LineID: {k}')
print('-' * 80)
print(v)
print()
LineID: 1
--------------------------------------------------------------------------------
Num  LineID  ColA  ColB  ColC
0    1       1   7.0   3.5  89.9
3    2       1   7.2   3.2  92.0
6    3       1   7.3   2.9  90.0
LineID: 2
--------------------------------------------------------------------------------
Num  LineID  ColA  ColB   ColC
1    1       2  6.80  3.10  90.02
4    2       2  7.10  3.10  89.80
7    3       2  7.03  3.04  90.00
LineID: 3
--------------------------------------------------------------------------------
Num  LineID  ColA  ColB  ColC
2    1       3   7.5  2.90  90.0
5    2       3   6.9  2.87  88.0
8    3       3   7.2  3.00  89.6

如果初始文件很大,或者如果您想节省内存,并且打开的文件可能比 FileID 多,您甚至可以使用 csv 模块一次处理一行。

假设初始文件file.txt,并且您希望将其拆分为多个file_i.txt文件,其中i是 LineID:

import csv
ident = 'LineID'
with open('file.txt') as fdin:
files = {}                # to store the output files and writers
rd = csv.DictReader(fdin, delimiter=' ', skipinitialspace=True)
for row in rd:
if not row[ident] in files:    # found a new LineID
fout = open('file_{}.txt'.format(row[ident]), 'w', newline='') # create the file
wr = csv.DictWriter(fout, rd.fieldnames)                       # and the associated writer
wr.writeheader()                                               # write the header
files[row[ident]] = (wr, fout)                                 # store everything in files
files[row[ident]][0].writerow(row)              # write each row to the appropriate file
# close the output files
for id in files:
files[id][1].close()

最新更新