Построить пандас с данными в каждой строке - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь построить несколько фреймов данных из некоторых данных, содержание которых (в терминах переменных, а не значений) может потенциально измениться в каждой строке в одном и том же фрейме данных.

Способ, которым я пытаюсьсделать это сейчас - создать новый 1-рядный фрейм данных для каждой новой строки, а затем добавить его к существующему фрейму данных, используя метод append.Это позаботится о создании новых столбцов и установит значение NaN для существующих строк.

Я также попробовал метод loc, как предложено здесь , но это возвращает ValueError.

В дополнение к этому, у меня может быть более тысячи возможных ярлыков.Поэтому я хотел бы избежать явного объявления всех столбцов в начале, и почти невозможно узнать, какие столбцы понадобятся для конкретного файла, не прочитав весь файл хотя бы один раз.

Однако я знаю, что построчное построение блока данных считается плохой (если не устаревшей) практикой.

Итак, допустим, мои данные взяты из текстового файла, похожего на этот:

A=10,B=2
A=20,B=3
A=30,C=Batman

и я хочу создать фрейм данных, который выглядит как

    a    b       c
0  10  2.0     NaN
0  20  3.0     NaN
0  30  NaN  Batman

Как бы вы предложили это сделать?

РЕДАКТИРОВАТЬ: данные поступают из очень грязного исправленоширина текста.Каждая строка текстового файла представляет собой непрерывную последовательность символов (без разделителя).Внутри строки есть 3 буквенных идентификатора, обозначающих начало раздела, за которыми следуют все значения этого раздела.У меня есть документ, который я перевел на язык python, в котором для каждого идентификатора указывается, сколько символов мне нужно прочитать после начала раздела и как они разделены.

Например.Одна строка может быть

AAA1234BBB789aa78CCC123456

Я бы тогда знал, что секция AAA имеет 3 значения, одно из которых состоит из двух цифр int, а два - из одной цифры int.За этим разделом BBB следует 3-значный int, 2-символьная строка и 2 однозначные.

У меня есть фрагмент кода, который переводит это в dict, который выглядит как

{'AAA_1': 12, 'AAA_2':3, 'AAA_3':4, 'BBB_1':789, 'BBB_2':aa,'BBB_3':7, 'BBB_4':8, ......}

EDIT2: Если вы хотите увидеть оригинальный файл, вы можете посмотреть здесь (любой из них будет работать):

ftp: //ftp.ncdc.noaa.gov/ pub / data / noaa / 2017 /

А чтобы понять, как это читать, посмотрите здесь (не хочу вас так сильно просить):

ftp://ftp.ncdc.noaa.gov/pub/data/noaa/ish-format-document.pdf

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Похоже, ваши данные лучше хранить в формате JSON. Если вы можете преобразовать свои данные в JSON следующим образом:

Содержимое data.json:

[
   {"A":10, "B":2},
   {"A":20, "B":3},
   {"A":30, "C":"Batman"}
]

Тогда вы можете просто сделать:

>>> df = pd.read_json('data.json')
>>> print(df)
    A    B       C
0  10  2.0     NaN
1  20  3.0     NaN
2  30  NaN  Batman
0 голосов
/ 26 октября 2018

Предполагается, что данные поступают в виде CSV-файлов. Вы можете прочитать каждый как

>>> print data1
     a       b    c
0   10       2  5.0
1    0     NaN  8.0
2  NaN  batman  9.0
3  cat     NaN  NaN

>>> print data2
   a  b     d
0  0  0   123
1  0  0   fox
2  0  0   883
3  0  0  bats

data1 = pd.read_csv('file1.csv',header=0)
data2 = pd.read_csv('file2.csv'.header=0)

затем: joined = pd.contact([data1,data2], sort=True).reset_index(drop=True)

>>> print joined
     a       b    c     d
0   10       2  5.0   NaN
1    0     NaN  8.0   NaN
2  NaN  batman  9.0   NaN
3  cat     NaN  NaN   NaN
4    0       0  NaN   123
5    0       0  NaN   fox
6    0       0  NaN   883
7    0       0  NaN  bats
0 голосов
/ 26 октября 2018

Вы можете сделать каждую строку словарным, а затем объединить их в фрейм данных

dic1 = {'a':10,'b':2}
dic2 = {'a':20,'b':3}
dic3 = {'a':30,'c':'batman'}

pd.DataFrame(data=[dic1,dic2,dic3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...