기차 당 초당 에너지 사용량을 포함하는 데이터 파일이 있지만 데이터 파일을 생성 한 응용 프로그램은 에너지 사용을 위해 0이있는 모든 행을 제거했으며 해당 행을 다시 만들어야합니다.
특히 필요합니다. 모든 열차 번호에 대해 기록을 추가해야하는 경우 에너지에 0을 사용하여 초당 적어도 하나의 기록이 있는지 확인합니다.
내 초기 DataFrame은 다음과 같습니다 (초는 자정 이후 초 단위의 타임 스탬프입니다).
train seconds energy
0 1024 13980 105.0000
1 1024 14745 114.0000
2 1024 14746 127.0100
3 1024 14747 137.5667
... ... ... ...
4284449 7564 95495 -301.6824
4284450 7564 95496 -181.0630
4284451 7564 95497 -60.3713
14745-13980 = 765 초의 행 0과 행 1 사이에 시간 간격이 있습니다. 우리가 아는 한, 모든 열차에 대한 초당 레코드의 유일한 간격은 첫 번째와 두 번째 레코드 사이에 있으며, 초 값의 차이에서 얼마나 많은 것이 누락되었는지 알 수 있습니다. 그러나 모든 열차에 대해 누락 된 초마다 하나의 행이 있어야하므로 누락 된 값만 첫 번째와 두 번째 레코드 사이에 있다고 가정하지 않는 것이 가장 좋습니다.
내 계획은 :
1 단계:
# Get the minimum and maximum seconds value per train
df = df_datafile.groupby(['train'])['seconds'].agg(['min', 'max']).rename(
columns={'min': 'minsec', 'max': 'maxsec'})
결과 :
minsec maxsec
train
1001 21923 25302
1003 22825 26197
1005 23736 27207
1007 24620 28009
1011 25548 28889
... ... ...
VIAE858 52785 53380
VIAE87 53442 54262
VIAE88 83204 85785
VIAE97 21942 27054
VIAE98 71123 73186
2 단계:
# Create one (train, second) record for every second of every train
df = DataFrame([product(*[[train], arange(minsec, maxsec)])
for train, minsec, maxsec in list(zip(df.index, df.minsec, df.maxsec))])
결과 :
0 1 2 ... 35403 35404 35405
0 (1001, 21923) (1001, 21924) (1001, 21925) ... None None None
1 (1003, 22825) (1003, 22826) (1003, 22827) ... None None None
2 (1005, 23736) (1005, 23737) (1005, 23738) ... None None None
3 (1007, 24620) (1007, 24621) (1007, 24622) ... None None None
4 (1011, 25548) (1011, 25549) (1011, 25550) ... None None None
... ... ... ... ... ... ... ...
2561 (VIAE858, 52785) (VIAE858, 52786) (VIAE858, 52787) ... None None None
2562 (VIAE87, 53442) (VIAE87, 53443) (VIAE87, 53444) ... None None None
2563 (VIAE88, 83204) (VIAE88, 83205) (VIAE88, 83206) ... None None None
2564 (VIAE97, 21942) (VIAE97, 21943) (VIAE97, 21944) ... None None None
2565 (VIAE98, 71123) (VIAE98, 71124) (VIAE98, 71125) ... None None None
[2566 rows x 35406 columns]
모든 None 값은 가장 긴 기차의 길이가 35406 초이고 Dataframe의 다른 모든 레코드가 해당 행의 열 수와 일치해야한다는 사실 때문입니다. 이러한 없음 값은 제거해야합니다.
하지만 지금은 붙어 있습니다. 내가 얻고 싶은 것은 :
train seconds
0 1001 21923
1 1001 21924
2 1001 21925
... ... ...
??? VIAE98 71123
??? VIAE98 71124
??? VIAE98 71125
효과적으로 각 개별 행이 전치되었으며 (개별 목록이 확장되고 널 요소가 제거됨) 전치 된 모든 행이 2 개 열로 구성된 하나의 긴 데이터 프레임으로 연결되었습니다.
이 마지막 단계를 도와 주실 수 있으신가요? 그리고 / 또는 원래 문제 설명을 할 수있는 다른 방법을 알려주 시겠어요 (처음에 기울임 꼴로 표시).
도움을 주셔서 대단히 감사합니다. StackOverflow 질문에 답 해주신 모든 분들께 정말 감사드립니다.
마크 배튼-캐류
당신은 사용할 수 reindex
복용 min
및 max
기차 그룹 초마다 :
def populate_df(grp):
grp = (grp.set_index('seconds')
.reindex(range(grp.seconds.min(), grp.seconds.max()+1))
.drop(columns='train')
.fillna(0)
)
return grp
df.groupby('train').apply(populate_df).reset_index()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다