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

, file_05 ,, \ r \ nx data, y data \ r \ n-970.0, -34.12164, \ r \ n-959.0, -32.37526, \ r \ n-949.0, -30.360199, \ r \ n-938.0, - 28.74816, \ r \ n-929.0, -27.53912, \ r \ n-920.0, -25.92707, \ r \ n-911.0, -24.31503, \ r \ n-900.0, -23.64334, \ r \ n-891.0, - 22.29997,

Попытка создать фрейм данных, который выглядел бы так

enter image description here

1
wkwkwk 13 Фев 2021 в 11:01

3 ответа

Лучший ответ

В приведенном ниже коде s - это строка:

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO(s)).dropna(axis=1)
df.rename(columns={df.columns[0]: ""}, inplace=True)

Кстати, если строка поступает из файла csv, то проще прочитать файл напрямую с помощью pd.read_csv.

Изменить: этот код создаст мультииндекс столбцов:

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO(s), header = None).dropna(how="all", axis=1).T
df[0] = df.loc[1, 0]
df = df.set_index([0, 1]).T
2
bb1 13 Фев 2021 в 09:10

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

  1. Шаг 1: Разделите строку на '\r\n'. Затем для каждого значения разделите на ','
  2. Шаг 2: Вышеупомянутый шаг создаст список списка. Элемент № 0 состоит из 4 элементов, а элемент № 1 - из 2 элементов. Остальные имеют по 3 элемента и являются фактическими данными.
  3. Шаг 3: Преобразуйте данные в словарь, начиная с элемента №3 и далее. Используйте значения в элементе № 2 как ключи для словаря (а именно x data и y data). Чтобы убедиться, что у вас есть ключ: [список значений], используйте dict.setdefault(key,[]).append(value). Это гарантирует, что данные создается как словарь «ключ: [список значений]».
  4. Шаг 4: Создайте нормальный фрейм данных, используя словарь, так как все значения хранятся как ключ и значения в словаре.
  5. Шаг 5: Теперь, когда у вас есть словарь, вы хотите создать MultiIndex. Преобразуйте столбец в MultiIndex.

Собирая все это вместе, получаем следующий код:

import pandas as pd

text = ',file_05,,\r\nx data,y data\r\n-970.0,-34.12164,\r\n-959.0,-32.37526,\r\n-949.0,-30.360199,\r\n-938.0,-28.74816,\r\n-929.0,-27.53912,\r\n-920.0,-25.92707,\r\n-911.0,-24.31503,\r\n-900.0,-23.64334,\r\n-891.0,-22.29997,'

line_text = [txt.split(',') for txt in text.split('\r\n')]

dct = {}

for x,y,z in line_text[2:]:
    dct.setdefault(line_text[1][0], []).append(x)
    dct.setdefault(line_text[1][1], []).append(y)

df = pd.DataFrame(dct)

df.columns = pd.MultiIndex.from_tuples([(line_text[0][i],line_text[1][i]) for i in [0,1]])

print (df)

Результатом этого будет:

              file_05
   x data      y data
0  -970.0   -34.12164
1  -959.0   -32.37526
2  -949.0  -30.360199
3  -938.0   -28.74816
4  -929.0   -27.53912
5  -920.0   -25.92707
6  -911.0   -24.31503
7  -900.0   -23.64334
8  -891.0   -22.29997
1
Joe Ferndz 13 Фев 2021 в 08:50
  1. Вам следует преобразовать ваши необработанные данные в таблицу с помощью Python.
  2. Сохраните в файл csv, импортируя пакет csv с помощью python.


from pandas import DataFrame

# s is raw datas
s = ",file_05,,\r\nx data,y data\r\n-970.0,-34.12164,\r\n-959.0,-32.37526,\r\n-949.0,-30.360199,\r\n-938.0,-28.74816,\r\n-929.0,-27.53912,\r\n-920.0,-25.92707,\r\n-911.0,-24.31503,\r\n-900.0,-23.64334,\r\n-891.0,-22.29997,"

# convert raw data to a table
table = [i.split(',') for i in s.split("\r\n")]
table = [i[:2] for i in table]

# table is like
"""
[['', 'file_05'],
 ['x data', 'y data'],
 ['-970.0', '-34.12164'],
 ['-959.0', '-32.37526'],
 ['-949.0', '-30.360199'],
  ...
 ['-891.0', '-22.29997']]
 """

# save to output.csv file 
import csv
with open('output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(table)
    
# Save to DataFrame df
from pandas import DataFrame
df = DataFrame (table[2:],columns=table[1][:2])
print(df)
0
William Mou 13 Фев 2021 в 08:43
66183007