如何使用 pandas 读取文本文件的键值对?
How to read text file's key, value pair using pandas?
我想解析一个包含以下数据的文本文件。
Input.txt-
1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d
在此输入文本文件中,没有固定的列,它可以是 10 或 20 或任何值。我想使用 pandas 解析此文件。输出应包含:
output.txt-
index[0]
1 88
11 1438
15 kkk
45 7.7
45 00
21 66
86 a
index[1]
4 13
4 1388
49 DDD
8 157.73
67 00
45 08
84 b
45 k
关于如何获得此类结果有什么建议吗?
你可以先read_csv
with separator which is not in data e.g. ;
, then double split
with stack
:
import pandas as pd
import numpy as np
import io
temp=u"""1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d
"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), sep=";", index_col=None, names=['text'])
print (df)
text
0 1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
1 4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
2 6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d
s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True)
print (s)
0 1
0 0 1 88
1 11 1438
2 15 KKK
3 45 7.7
4 45 00
5 21 66
6 86 a
1 0 4 13
1 4 1388
2 49 DDD
3 8 157.73
4 67 00
5 45 08
6 84 b
7 45 k
2 0 6 84
1 41 18
2 56 TTT
3 67 1.2
4 4 21
5 45 78
6 07 d
dfs = [g.set_index(0).rename_axis(None) for i, g in s.groupby(level=0)]
print (dfs[0])
1
1 88
11 1438
15 KKK
45 7.7
45 00
21 66
86 a
for i, g in s.groupby(level=0):
print (g.set_index(0).rename_axis(None))
1
1 88
11 1438
15 KKK
45 7.7
45 00
21 66
86 a
1
4 13
4 1388
49 DDD
8 157.73
67 00
45 08
84 b
45 k
1
6 84
41 18
56 TTT
67 1.2
4 21
45 78
07 d
通过评论编辑:
如果需要写入文件 s
,请使用 to_csv
:
s.to_csv('file.txt', header=None, index=None, sep='\t')
EDIT1 通过评论:
你可以通过rename_axis
(pandas
0.18.0
中的新功能)将列名设置为空字符串并删除索引名,但更常见的是将列名设置为一些文本(例如s.columns = ['idx','a']
):
s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True)
s.columns = ['idx','']
print (s)
idx
0 0 1 88
1 11 1438
2 15 KKK
3 45 7.7
4 45 00
5 21 66
6 86 a
1 0 4 13
1 4 1388
2 49 DDD
3 8 157.73
4 67 00
5 45 08
6 84 b
7 45 k
2 0 6 84
1 41 18
2 56 TTT
3 67 1.2
4 4 21
5 45 78
6 07 d
dfs = [g.set_index('idx').rename_axis(None) for i, g in s.groupby(level=0)]
print (dfs[0])
1 88
11 1438
15 KKK
45 7.7
45 00
21 66
86 a
我想解析一个包含以下数据的文本文件。
Input.txt-
1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d
在此输入文本文件中,没有固定的列,它可以是 10 或 20 或任何值。我想使用 pandas 解析此文件。输出应包含:
output.txt-
index[0]
1 88
11 1438
15 kkk
45 7.7
45 00
21 66
86 a
index[1]
4 13
4 1388
49 DDD
8 157.73
67 00
45 08
84 b
45 k
关于如何获得此类结果有什么建议吗?
你可以先read_csv
with separator which is not in data e.g. ;
, then double split
with stack
:
import pandas as pd
import numpy as np
import io
temp=u"""1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d
"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), sep=";", index_col=None, names=['text'])
print (df)
text
0 1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
1 4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
2 6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d
s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True)
print (s)
0 1
0 0 1 88
1 11 1438
2 15 KKK
3 45 7.7
4 45 00
5 21 66
6 86 a
1 0 4 13
1 4 1388
2 49 DDD
3 8 157.73
4 67 00
5 45 08
6 84 b
7 45 k
2 0 6 84
1 41 18
2 56 TTT
3 67 1.2
4 4 21
5 45 78
6 07 d
dfs = [g.set_index(0).rename_axis(None) for i, g in s.groupby(level=0)]
print (dfs[0])
1
1 88
11 1438
15 KKK
45 7.7
45 00
21 66
86 a
for i, g in s.groupby(level=0):
print (g.set_index(0).rename_axis(None))
1
1 88
11 1438
15 KKK
45 7.7
45 00
21 66
86 a
1
4 13
4 1388
49 DDD
8 157.73
67 00
45 08
84 b
45 k
1
6 84
41 18
56 TTT
67 1.2
4 21
45 78
07 d
通过评论编辑:
如果需要写入文件 s
,请使用 to_csv
:
s.to_csv('file.txt', header=None, index=None, sep='\t')
EDIT1 通过评论:
你可以通过rename_axis
(pandas
0.18.0
中的新功能)将列名设置为空字符串并删除索引名,但更常见的是将列名设置为一些文本(例如s.columns = ['idx','a']
):
s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True)
s.columns = ['idx','']
print (s)
idx
0 0 1 88
1 11 1438
2 15 KKK
3 45 7.7
4 45 00
5 21 66
6 86 a
1 0 4 13
1 4 1388
2 49 DDD
3 8 157.73
4 67 00
5 45 08
6 84 b
7 45 k
2 0 6 84
1 41 18
2 56 TTT
3 67 1.2
4 4 21
5 45 78
6 07 d
dfs = [g.set_index('idx').rename_axis(None) for i, g in s.groupby(level=0)]
print (dfs[0])
1 88
11 1438
15 KKK
45 7.7
45 00
21 66
86 a