2017-11-21 5 views
0

때때로 열 이름을 공유하는 팬더 데이터 프레임으로 변환되는 데이터 파일이 있습니다. 시계열 인덱스를 공유하는 다른 데이터 프레임은 일치 할 때마다 열과 인덱스를 기반으로 하나의 데이터 프레임으로 결합하고자합니다 . 이름 지정에 시퀀스가 ​​없으므로 연결을 위해 무작위로 나타납니다. 두 개의 데이터 프레임에 서로 다른 열이 연결되어있는 경우 axis=1이 제대로 작동하지만 결과 데이터 프레임이 이전 병합 된 팬더 데이터 프레임 중 하나의 열 이름과 함께 새 df와 결합되는 경우 연결되지 않습니다. 이러한 데이터 files로 예를 들면 : 나는 그렇게 할 때특정 시퀀스를 따르지 않은 Concat pandas 데이터 프레임

import pandas as pd 

df1 = pd.read_csv('0.csv', index_col=0, parse_dates=True, infer_datetime_format=True) 
df2 = pd.read_csv('1.csv', index_col=0, parse_dates=True, infer_datetime_format=True) 
df3 = pd.read_csv('2.csv', index_col=0, parse_dates=True, infer_datetime_format=True) 

data1 = pd.DataFrame() 
file_list = [df1, df2, df3] # fails 
# file_list = [df2, df3,df1] # works 
for fn in file_list: 
    if data1.empty==True or fn.columns[1] in data1.columns: 
     data1 = pd.concat([data1,fn]) 
    else: 
     data1 = pd.concat([data1,fn], axis=1) 

나는 ValueError: Plan shapes are not aligned를 얻을. 필자의 경우 모든 DataFrames를 먼저로드하고 열 이름을 확인할 방법이 없습니다. 이제는 df과 같은 열 이름을 합쳐서 concat과 결합 할 수 있습니다. 다른 열 이름을 가진이 결과 데이터 프레임은 axis=1에 따라 항상 다음과 같이 작동합니다. 그러나 모든 DataFrames를 미리로드하고 연결 시퀀스를 다시 정렬해야하는 솔루션은 필자의 경우 불가능합니다 (위의 작업 예제에서만 완료되었습니다). 정보가 나오는 순서에 관계없이 더 큰 데이터 프레임 data1과 연결할 수있는 유연성이 필요합니다. 제안 된 적절한 접근 방법이 있으면 알려주십시오.

답변

1

단계별로 루프를 진행하면 첫 번째 반복에서는 if이되므로 data1df1과 같습니다. 두 번째 반복에서는 data1이 비어 있지 않고 ''Temperature product barrel ValueY''data1.columns이 아니기 때문에 else으로갑니다. 그 외의 경우 data1에는 중복 된 열 이름이 있습니다. 중복 된 열 이름의 모든 행에. (두 열 중 하나는 Nan이고 다른 하나는 부동입니다.) 이것이 pd.concat()이 실패하는 이유입니다.

당신이 그것을 없애 연결하는 시도하기 전에 당신은 중복 열을 집계 할 수 있습니다 그 후

for fn in file_list: 
    if data1.empty==True or fn.columns[1] in data1.columns: 
     # new: 
     data1 = data1.groupby(data1.columns, axis=1).agg(np.nansum) 
     data1 = pd.concat([data1,fn]) 
    else: 
     data1 = pd.concat([data1,fn], axis=1) 

을, 당신은 얻을 것

data1.shape 
(30, 23) 
관련 문제