从现有数据文件创建表时,只保留最后一行的值



我刚开始学习python,我有一个关于创建表的基本问题。

我有一个名为example.txt的文件,如下所示:

# Header information 1
# Header information 2
# Header information 3
# Header information 4
# var1  var2      var3      var4      var5
# Header information 5
# Header information 6
1   6500.0    5.052300  1.020020  9.355021
2   2500.7    3.038809  0.033637  1.736393
3    750.6    5.003003  0.047254  3.287092
...
...
...
100   2700.6    9.002800  0.088105  8.289851

我想使用变量(var1、var2等(的名称作为标题名称来创建一个表。我试过这个:

fnExample = open('example.txt', 'r')
i = 0
for line in fnExample:
i = i + 1
if i==5 :
varExample = [word.strip() for word in line.split()]
if (i>7 and i<100):
dataExample = [word.strip() for word in line.split()]
datatable[varExample[1]]=dataExample[0]
datatable[varExample[2]]=dataExample[1]
datatable[varExample[3]]=dataExample[2]
datatable[varExample[4]]=dataExample[3]
datatable[varExample[5]]=dataExample[4]
print(datatable['var1']) # gives only the last value of var1

为什么我的datatable只包含最后一个值,我该如何修复它?

在每次迭代中覆盖datatable的每个键处的值,因此,上次迭代后剩下的是上次迭代的值也就不足为奇了。在开始迭代之前,您应该创建一个列表来保存所有行的字典,然后为每一行创建一个新字典,并在每次迭代中将其附加到列表中。

我用了循环/听写理解来做这件事,而不是写五行。此外,我不知道为什么要将标题中的第1列名称与第0列相关联,但我保留了该行为,以防其正确。如果要更改它并将第0个标头与第0列相关联,请删除varExample = varExample[1:]行。

fnExample = open('example.txt', 'r')
datatable = []
for i, line in enumerate(fnExample):
if i == 5 :
varExample = [word.strip() for word in line.split()]
varExample = varExample[1:] # Discard the first element of the vars because you don't use it
elif i > 7 and i < 100:
dataExample = [word.strip() for word in line.split()]
row_dict = {var: data for var, data in zip(varExample, dataExample)}
datatable.append(row_dict)
fnExample.close()
print(datatable) # prints the entire list

如果你正在使用panda,你现在可以使用创建一个完整的数据帧

df = pd.DataFrame(datatable)

请注意,如果您无论如何都在使用panda,您可以指定一个要跳过的行列表作为read_csvskiprows参数,并且在单个函数调用中会得到相同的结果

如果你正在使用数据表包,我对它不熟悉,但我相信如果你浏览文档,有一种方法可以将dict列表转换为dict。


如果您希望将数据结构化为字典,其中每个键都会为您提供该列中的数据列表,这也很容易。在这种情况下,在读取列名时创建一个dict,并将这些键的值设置为空列表。然后在读取行时追加到这些列表中。

for i, line in enumerate(fnExample):
if i == 5 :
varExample = [word.strip() for word in line.split()]
datatable = {var: [] for var in varExample[1:]} # Ignore the first element of the vars because you don't use it

elif i > 7 and i < 100:
dataExample = [word.strip() for word in line.split()]
for lst, data in zip(datatable.values(), dataExample):
lst.append(data)

现在,print(datatable['var1'])将打印列var1中的所有值。

您可以使用panda方法pandas.read_csv并忽略不需要的行:

import pandas
datatable = pandas.read_csv('example.txt', sep=r's+',skiprows=[0,1,2,3,5,6])

请记住,分隔符sep=' '必须为每列留出空格,'s+'允许为一个或多个空格。此外,您不必使用参数head=4,因为其他行将被忽略,第4行将成为第一行(默认情况下为标题(

示例文件:

Header information 1
Header information 2
Header information 3
Header information 4
var1 var2 var3 var4 var5
Header information 5
Header information 6
1 6500.0 5.052300 1.020020 9.355021
2 2500.7 3.038809 0.033637 1.736393
3 750.6 5.003003 0.047254 3.287092

输出:

var1    var2    var3    var4    var5
0   1   6500.0  5.052300    1.020020    9.355021
1   2   2500.7  3.038809    0.033637    1.736393
2   3   750.6   5.003003    0.047254    3.287092

最新更新