Python 以分隔符作为换行符(\n)和换行符作为两个换行符(\n\n)读取熊猫中的文本文件
我有一个如下格式的文本文件: data.txtPython 以分隔符作为换行符(\n)和换行符作为两个换行符(\n\n)读取熊猫中的文本文件,python,pandas,file,dataframe,io,Python,Pandas,File,Dataframe,Io,我有一个如下格式的文本文件: data.txt 2 8 4 3 1 9 6 5 7 如何将其读入数据帧 0 1 2 0 2 8 4 1 3 1 9 2 6 5 7 虽然这肯定不是最好的处理方法,但我们可以自己做一些处理。如果这些值是整数,则应采用以下方法: import pandas as pd with open('data.txt') as f: data = [list(map(int, row.split())) for row in f.read().split(
2
8
4
3
1
9
6
5
7
如何将其读入数据帧
0 1 2
0 2 8 4
1 3 1 9
2 6 5 7
虽然这肯定不是最好的处理方法,但我们可以自己做一些处理。如果这些值是整数,则应采用以下方法:
import pandas as pd
with open('data.txt') as f:
data = [list(map(int, row.split())) for row in f.read().split('\n\n')]
dataframe = pd.DataFrame(data)
产生:
>>> dataframe
0 1 2
0 2 8 4
1 3 1 9
2 6 5 7
选项1
如果您知道一个组中总是有
N
元素,那么就更容易了-只需加载数据并重塑-
pd.DataFrame(np.loadtxt('data.txt').reshape(3, -1))
0 1 2
0 2.0 8.0 4.0
1 3.0 1.0 9.0
2 6.0 5.0 7.0
要加载整数,请将dtype
传递到loadtxt
-
pd.DataFrame(np.loadtxt('data.txt', dtype=int).reshape(3, -1))
0 1 2
0 2 8 4
1 3 1 9
2 6 5 7
选项2
这是更一般的,当你不能保证一次总是有3个数字时,它会起作用。这里的想法是将空白行读取为
NaN
,并根据NaN
s的存在来分隔数据
df = pd.read_csv('data.txt', header=None, skip_blank_lines=False)
df
0
0 2.0
1 8.0
2 4.0
3 NaN
4 3.0
5 1.0
6 9.0
7 NaN
8 6.0
9 5.0
10 7.0
df_list = []
for _, g in df.groupby(df.isnull().cumsum().values.ravel()):
df_list.append(g.dropna().reset_index(drop=True))
df = pd.concat(df_list, axis=1, ignore_index=True)
df
0 1 2
0 2.0 8.0 4.0
1 3.0 1.0 9.0
2 6.0 5.0 7.0
警告-如果您的数据也有NAN,这将无法正确分离 试试这个:
with open(filename, 'r') as f:
data = f.read().replace('\n',',').replace(',,','\n')
In [7]: pd.read_csv(pd.compat.StringIO(data), header=None)
Out[7]:
0 1 2
0 2 8 4
1 3 1 9
2 6 5 7
3个元素之后总是有间隙吗?不,可以有任意数量的元素,但每个区块中的元素数量相同好的,在这种情况下,请参见我的答案。您可以利用每个块中的元素相等这一事实来获得非常有效的解决方案。@cᴏʟᴅsᴘᴇᴇᴅ 有没有办法在pd.read_表中使用'sep'和'lineterminator'关键字来阅读此内容。不可能,因为
lineterminator
的长度不能大于1。是否可以为常规数据添加替代项,而不仅仅是整数?第二种解决方案非常好,(+1)@jezrael谢谢。不幸的是,不知道这是否是一个可行的选择是令人恼火的,因为OP不愿意及时回答问题/反馈。是的,我不喜欢这种问题,因为这取决于数据…:(这是一个令人惊讶的开箱即用的答案。我喜欢它!