使用Python for循环在运行时更新列值

时间:2018-03-09 07:08:29

标签: python python-3.x pandas for-loop

我有一组137个文本文件,每个文件都有格式名称,性别,出生次数的数据。每个文件都在其名称后附加年份名称,例如'yob1881.txt'

我想从这137个文件中获取数据并将它们附加到数据框中,并在此过程中添加一个新的列。

这是我到目前为止所做的:

filenames = glob('yob*.txt')

df = pd.DataFrame()

for x in filenames:
  startPOS = df.shape[0]
  df = df.append(pd.read_csv(x, header=None))
  endPOS = df.shape[0]
  df.loc[startPOS:endPOS+1, 'year'] = int(x.split('.')[0][-4:])

但是,代码在最后一行抛出错误。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

所以,这是我在代码中可以看到的一个快速的东西。从第一个文件中获取数据后,您将其附加到 df ,并在最后添加年份变量。

但是当你第二次做同样的事情时 df 已经包含变量"年"。这是 df 中存在的变量数量不匹配。一个快速修复可能是。

filenames = glob('yob*.txt')

df = pd.DataFrame()

for x in filenames:
    df_new = pd.read_csv(x, header=None)
    df_new["year"] = int(x.split('.')[0][-4:])
    df = df.append(df_new)

答案 1 :(得分:1)

我同意Tanmoy的回复,错误日志会很高兴看到。 也就是说,假设,正如您所说的每个文件的内容具有相同的列,更容易将日期添加到每个文件的DataFrame中,然后连接所有文件:

import pandas as pd
import re

data = []

filenames = glob('yob*.txt')
for x in filenames:
  year = int(re.search("(\d+)", x).group())
  data.append(pd.read_csv(x, header=None))
  data[-1]['year'] = [year, ] * data[-1].shape[0]

df = pd.concat(data)

这样的事情可以解决你的问题。