如何从自定义值创建DataFrame

时间:2017-10-27 17:59:23

标签: python pandas dataframe data-cleaning

我正在阅读一个文本文件,每行都有多个值。我正在使用函数解析基于需求解析它们。

def parse(line):
    ......
    ......
    return line[0],line[2],line[5]

我想创建一个数据框,每行作为一行,三个回归值作为列

df = pd.DataFrame()

with open('data.txt') as f:
    for line in f:
       df.append(line(parse(line)))

当我运行上面的代码时,我将所有值都作为单个列。是否有可能以适当的表格格式获取它。

3 个答案:

答案 0 :(得分:4)

你不应该在一个循环中.appendDataFrame,这无论如何都是非常低效的。做类似的事情:

colnames = ['col1','col2','col3'] # or whatever you want
with open('data.txt') as f:
    df = pd.DataFrame([parse(l) for l in f], columns=colnames)

注意,基本问题是pd.DataFrame.append期望另一个数据帧,并且它会附加该另一个数据帧的。它将列表解释为一堆单行。请注意,如果您将列表构造为具有“行”,则它将按预期工作。但是你不应该在这里使用.append

In [6]: df.append([1,2,3])
Out[6]:
   0
0  1
1  2
2  3

In [7]: df = pd.DataFrame()

In [8]: df.append([[1, 2, 3]])
Out[8]:
   0  1  2
0  1  2  3

答案 1 :(得分:0)

Umaformarápidodefazer isso(TL; DR):

创建新列:

  `df['com_zeros'] = '0'`

应用条件::

for b in df.itertuples():
    df.com_zeros[b.Index] = '0'+str(b.battles) if b.battles<9 else str(b.battles)

<强>结果:

df
     regiment company deaths  battles size com_zeros
0  Nighthawks     1st    kkk        5    l        05
1  Nighthawks     1st     52       42   ll        42
2  Nighthawks     2nd     25        2    l        02
3  Nighthawks     2nd    616        2    m        02

请参阅https://repl.it/JHW6的示例。

<强>观测值: 在repl.it上运行的示例似乎挂起,但情况并非如此,repl.it上的pandas负载总是很耗时。

禁止jupyter笔记本上的警告:

import warnings
warnings.filterwarnings('ignore')

答案 2 :(得分:0)

除了@ juanpa.arrilaga,

看来你确实有一个结构化文件,只需要文件中的第1个和第5个项目。

加载并使用drop

df = pd.read_csv('file')

df.drop([columns],axis = 1)