добавление (список) списков в csv с использованием pandas dataframe или чего-либо еще python 3 - PullRequest
0 голосов
/ 07 мая 2018

У меня есть 10 списков с тысячами строк, например:

l1 = ['a1', 'a2', ...], l2 = ['1', '2', ...], ..., l10 = ['abc', 'sde', ...]

количество строк у всех одинаковое. Я хотел бы создать файл CSV, например:

name reg... address

'a1' '1'... 'abc'

'a2' '2'... 'sde'

Сначала я подумал об использовании pandas DataFrame: (я использовал только 103 первые строки для тестирования)

data = [l1, l2,..., l10]
lables = ['name', 'reg', ...,'address']    
df = pd.DataFrame(data, columns=labels)
....

Я получил эту ошибку:

Traceback (последний вызов был последним): Файл "ch.py", строка 122, в список-статусов, список-извлечений, список_источников) Файл "ch.py", строка 95, на благотворительность df = pd.DataFrame (данные, столбцы = метки) Файл "C: \ Users \ MON \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site packages \" pandas \ core \ frame.py ", строка 369, в init массивы, столбцы = _to_arrays (данные, столбцы, dtype = dtype) Файл "C: \ Users \ MON \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \" pandas \ core \ frame.py ", строка 6284, в _to_arrays dtype = dtype) Файл "C: \ Users \ MON \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \" pandas \ core \ frame.py ", строка 6363, в _list_to_arrays coerce_float = coerce_float) Файл "C: \ Users \ MON \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \" pandas \ core \ frame.py ", строка 6420, в _convert_object_array 'столбцы'% (len (столбцы), len (контент)))

AssertionError: 10 переданных столбцов, переданные данные имели 103 столбца

Тогда я попытался использовать:

data = [l1, l2,..., l10]
with open('charity.csv', 'w') as  ch_list:
        wr = csv.writer(ch_list, lineterminator='\n')
        wr.writerows(data)

Но я получил все данные от l1 до l10 в одном столбце.

У меня есть два вопроса:

1- Как мне решить мою проблему? С точки зрения производительности, я предпочитаю использовать DataFrame от pandas, однако я открыт для любых новых предложений.

2-Что означает ошибка, которую я получил для DataFrame и как я могу ее исправить?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Задача (ответ на второй вопрос): Ошибка возникает из-за способа передачи параметров.

Рассмотрим код:

import pandas as pd
l1 = [1,2,3,4]
l2=['a','b','c','d']
values = [l1,l2]
df2 = pd.DataFrame(values, columns=['p', 'q', 'r', 's'])
df2.head()

    a   b   c   d
0   1   2   3   4
1   a   b   c   d

Проблема в том, что переданные столбцы интерпретируются как строки (см. Документ pandas). Следовательно, каждый элемент значений - это строка, а длина строки - это общее количество столбцов, которое здесь равно 4.

Решение: * * 1011 Правильный способ передачи параметров

d = {'num':l1, 'char':l2}
df = pd.DataFrame(data=d)
df.head()
    char  num
0   a     1
1   b     2
2   c     3
3   d     4
0 голосов
/ 07 мая 2018
df = pd.DataFrame({'l%i'%i:data[i] for i in range(len(data))})
0 голосов
/ 07 мая 2018

2-Что означает ошибка, которую я получил для DataFrame и как я могу решить это?

Ваша ошибка говорит о том, что data имеет 103 записи, в то время как labels имеет 3 заголовка столбца. Вы можете использовать вышеуказанное решение.

РЕДАКТИРОВАТЬ: на основе комментария ОП, похоже, что ниже приведено решение

l1 = ['a1', 'a2', 'a3']
l2 = ['c1', 'c2', 'c3']
l3 = [1,2,3]
labels=['name', 'reg', 'address']
df = pd.DataFrame(np.column_stack([l1, l2, l3]), columns=labels)

Выход:

    name    reg  address
0   a1      c1     1
1   a2      c2     2
2   a3      c3     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...