使用Pandas从具有不同行长度的文件导入数据

时间:2017-03-20 09:24:50

标签: python list pandas dataframe python-import

我有一个包含一定数量行的txt文件。 每行可能包含不同数量的项目。

以下是input.txt的示例:

1,0,50,20,2,96,152,65,32,0
1,0,20,50,88,45,151
1,1,90,15,86,11,158,365,45
2,0,50,20,12,36,157,25
2,0,20,50,21,63,156,76,32,77
3,1,50,20,78,48,152,75,52,22,96

我的目标是将这些数据存储在具有以下结构的数据框中:

  • 5列
  • 从1到4的列包含每行包含的前4个值
  • 5列包含存储每行剩余内容的列表

因此输出应如下:

Out[8]: 
   A  B   C   D                              E
0  1  0  50  20        [2, 96, 152, 65, 32, 0]
1  1  0  20  50                  [88, 45, 151]
2  1  1  90  15         [86, 11, 158, 365, 45]
3  2  0  50  20              [12, 36, 157, 25]
4  2  0  20  50      [21, 63, 156, 76, 32, 77]
5  3  1  50  20  [78, 48, 152, 75, 52, 22, 96]

我尝试使用pandas.read_csv('input.txt'),但由于行的长度不同,因此无效。

你能否建议我以聪明而优雅的方式实现我的目标?

1 个答案:

答案 0 :(得分:7)

您可以将read_csv与某些不在数据中的分隔符一起使用 - 输出为一列df

import pandas as pd
from pandas.compat import StringIO

temp="""1,0,50,20,2,96,152,65,32,0
1,0,20,50,88,45,151
1,1,90,15,86,11,158,365,45
2,0,50,20,12,36,157,25
2,0,20,50,21,63,156,76,32,77
3,1,50,20,78,48,152,75,52,22,96"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), sep="|", names=['A'])
print (df)
                                 A
0       1,0,50,20,2,96,152,65,32,0
1              1,0,20,50,88,45,151
2       1,1,90,15,86,11,158,365,45
3           2,0,50,20,12,36,157,25
4     2,0,20,50,21,63,156,76,32,77
5  3,1,50,20,78,48,152,75,52,22,96

然后使用split

cols = list('ABCDE')
df[cols] = df.A.str.split(',', n=4, expand=True)
df.E = df.E.str.split(',')
print (df)
   A  B   C   D                              E
0  1  0  50  20        [2, 96, 152, 65, 32, 0]
1  1  0  20  50                  [88, 45, 151]
2  1  1  90  15         [86, 11, 158, 365, 45]
3  2  0  50  20              [12, 36, 157, 25]
4  2  0  20  50      [21, 63, 156, 76, 32, 77]
5  3  1  50  20  [78, 48, 152, 75, 52, 22, 96]