Estoy leyendo en un archivo de texto, en cada línea hay múltiples valores. Los estoy analizando en función de los requisitos utilizando la función de análisis.

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

Quiero crear un marco de datos, con cada línea como una fila y los tres valores recuperados como columnas

df = pd.DataFrame()

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

Cuando ejecuto el código anterior, obtengo todos los valores como una sola columna. ¿Es posible obtenerlo en el formato tabular adecuado?

3
user4881368 27 oct. 2017 a las 20:59

3 respuestas

La mejor respuesta

No debe .append a DataFrame en un bucle, eso es muy ineficiente de todos modos. Haz algo como:

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)

Tenga en cuenta que el problema fundamental es que pd.DataFrame.append espera otro marco de datos , y agrega las filas de ese otro marco de datos. Interpreta una lista como un grupo de filas individuales. Entonces, tenga en cuenta que si estructura su lista para que tenga "filas", funcionaría según lo previsto. Pero no deberías usar .append aquí de todos modos:

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
4
juanpa.arrivillaga 27 oct. 2017 a las 18:13

Uma forma rápida de fazer isso (TL; DR):

Creación de la nueva columna:

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

Aplicación de la condición ::

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

Resultado:

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

Vea el ejemplo de https://repl.it/JHW6.

Obs .: El ejemplo que se ejecuta en repl.it parece bloquearse, pero ese no es el caso, la carga de pandas en repl.it siempre lleva mucho tiempo.

Para suprimir advertencias en el cuaderno jupyter:

import warnings
warnings.filterwarnings('ignore')
0
Anderson Builder 27 oct. 2017 a las 18:13

Además de @ juanpa.arrillaga,

Parece que tiene un archivo estructurado y solo necesita el primer, tercer y quinto elemento del archivo.

Cargarlo y usar soltar

Df = pd.read_csv ('archivo')

Df.drop ([columnas], eje = 1)

0
kaihami 27 oct. 2017 a las 18:15