Разделение одного столбца на несколько на основе данных или разрыва строки

#python-3.x #pandas

Вопрос:

Я работаю на python и пытаюсь использовать pandas для разделения одного столбца на несколько в зависимости от наличия даты или разрыва строки. Вот структура моих данных:

Колонка
1/1/2020
АСТ: 100
ALT: 200
1/2/2020
АСТ: 200
ALT: 300
1/3/2020
АСТ:100
ALT:200

Мой конечный результат, который я ожидаю, будет чем-то вроде

1/1/2020 1/2/2020 1/3/2020
АСТ:100 АСТ:200 АСТ:100
ALT:200 ALT:300 ALT:200

Любые предложения будут оценены с благодарностью

Комментарии:

1. Добавьте код, который вы протестировали, и убедитесь, что все ошибки журнала, с которыми вы сталкиваетесь, также должны быть записаны, чтобы помочь другим иметь четкое представление о том, в чем ваша проблема.

2. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

Сначала я создал new столбец для группировки даты и значений ниже этого. После использования groupby и concat я получил результат, которого вы ожидали.

 df["new"] =pd.to_datetime(df["Column"],errors="coerce").notna().cumsum()
datas=[]
for key,value in df.groupby("new"):
    datas.append(pd.DataFrame(value).reset_index(drop=True))
df=pd.concat(datas,axis=1).filter(like="Column")
df.columns=df.iloc[0]
df=df[1:]
print(df)
 

ВОЗВРАТ

     1/1/2020    1/2/2020    1/3/2020
1   AST: 100    AST: 200    AST:100
2   ALT: 200    ALT: 300    ALT:200
 

Комментарии:

1. Это сработало безупречно! Спасибо!

Ответ №2:

Вы можете использовать pivot , если сначала настроите несколько вспомогательных столбцов:

 (df.assign(group=df['Column'].isna().shift(fill_value=0).cumsum())
   .assign(index=lambda d: d.groupby('group').cumcount())
   .pivot(index='group', columns='index', values='Column')
   .set_index(0)                          # set the dates as index
   .T                                     # transpose back to desired format
   .rename_axis(index=None, columns=None) # you can set custom names here
   .iloc[:-1]                             # remove NaNs in last position
)
 

выход:

    1/1/2020  1/2/2020 1/3/2020
1  AST: 100  AST: 200  AST:100
2  ALT: 200  ALT: 300  ALT:200
 

Комментарии:

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

Ответ №3:

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

 import pandas as pd
infile = open("new2.txt")
dict = {}
indexx = 0
for line in infile:
    line = line.rstrip('nr')
    if "/" in line:
        date = line
        if indexx == 0: dict = {date:[]}
        else: dict[date] = []
    if ":" in line:
        dict[date].append(line)
    if line == "":
        indexx  = 1
        continue

df = pd.DataFrame.from_dict(dict)
df.to_csv("new22.txt", index = False)