我有一个文本文件,我想根据其中一行中的值将其细分为 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)
groupby
和to_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
dict
DataFrame
'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()