#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)