2017-12-30 7 views
0

우선, 내가 아는 것보다 더 많은 실수가있을 수있다. 나는 새로운 것이라는 사실을 전혀 이해하지 못한다. 다음 그림과 같이 테이블을 인덱싱하려고합니다. 열 A와 B를 점차적으로 읽고 추가하는 중입니다. 합계로 각 15000 개의 행과 함께 500 개의 파일을 읽습니다. 이제 다음 그림과 같이 MultiIndex를 사용해야합니다. 그러나 팬더 계층 구조 인덱스 및 MultIndex를 사용하여 루프 내에서이를 수행 할 수있는 방법을 찾지 못했습니다. 모든 데이터 포인트와 숫자에 대해 루프를 수행하는 방법이 있습니까? 파이썬을 가진 루프를 가진 계층 적 다중 인덱스 테이블


all_data = pd.DataFrame() 

for f in glob.glob("path_in_dir"): 
    df = pd.read_table(f, delim_whitespace=True, 
        names=('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'), 
        dtype={'A': np.float32, 'B': np.float32, 'C': np.float32, 
          'D': np.float32,'E': np.float32, 'F': np.float32, 
          'G': np.float32,'H': np.float32}) 

    all_data = all_data.append(df,ignore_index=True) 

all_data.index.names = ['numbers'] 

enter image description here

내가 추가 사용하고있는 모든 데이터

print(all_data)

을 보여하지만 나는 또한 속도를 증가하는 것이 중요 할 것이다 pd.concat 같은 효율적이지 어딘가에 읽기 메모리 사용을 줄입니다. 나는이 방법으로 그것을 시도 할 때 : all_data = pd.concat(df,ignore_index=True)을 나는 오류 얻을 :

첫 번째 인수는 팬더 객체의 반복자이어야합니다, 당신은 내가 단지 D 열을 얻는 순간 유형 "DataFrame"

의 객체를 전달 하지만 0부터 끝까지 계산해서 30000까지 2 개의 파일을 만들 수 있습니다. 따라서 각 파일 데이터 포인트를 세지 않고 분할합니다. 새로운 이름의 길이가되어야합니다 1

+0

? 입력 소스가 무엇입니까? 모든 데이터가 포함 된 단일 DataFrame을 가져 왔습니까? .set_index ([ 'col1', 'col2'])'그냥 해봤 어. 현재 귀하가 시도한 바를 알고 있거나 귀하가 어디에 있는지 알 수 없으므로 도움이 필요하다고 제안하는 것이 명확하지 않습니다. –

+0

@JonClements 내 문제에 대해 더 나은 아이디어를 얻으려면 아래의 내 대답을 참조 해 주셔서 감사합니다. – newpyguy

+0

원본 데이터의 모습을 게시 할 수 있습니까? –

답변

0

이 이런 식으로 뭔가를 시도 가지고 :`all_data.index.names = [데이터 포인트, 숫자] 메시지 ValueError를 얻을 :

나는에 인덱스를 확장 할 때. 루프 내에서 수행 할 수 있기 때문에 all_data을 선언 할 필요가 없습니다. 사전 부분은 찾고있는 다중 색인 작성에 도움이됩니다.

# make a test txt file 
txt = open('df1.txt', mode = 'w') 
txt.write('1 2 3 4 5 6 7 8 \n2 4 6 8 10 12 14 16') 
txt.close() 

# make a dictionary for storing the dataframes 
dataframes = {} 

# import files with for-loop in my current working directory (otherwise a different path) 
for file in enumerate(glob.glob(os.getcwd()+'/*.txt')): # using *.txt to only retrieve .txt files 
    dataframes.update({file[0] + 1: pd.read_table(file[1], delim_whitespace = True, names = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'), dtype = { 
     'A' : np.float32, 
     'B' : np.float32, 
     'C' : np.float32, 
     'D' : np.float32, 
     'E' : np.float32, 
     'F' : np.float32, 
     'G' : np.float32, 
     'H' : np.float32 
    })}) 

# concat dataframes together 
df = pd.concat(dataframes, axis = 0) 

# label indices to match wanted output 
df.index.names = ['Datapoint', 'number'] 

df 

output

이 발생한 어떤 어려움
+0

고맙다. 파이썬에 익숙하지는 않지만 다음과 같이 해보려고했다. 우선 모든 데이터를 하나의 큰 데이터 프레임으로 읽는 중이다. 데이터 포인트와 숫자를 만드는 것보다 두 파일을 위해 코드를 생성했다. 자동화를 원하고 가능하다면 많은 메모리를 사용하지 않기를 바란다. 코드에 대한 내 대답은 아래를 참조하십시오. – newpyguy

관련 문제