Pandas로 여러 엑셀파일의 데이터를 정렬하는 데 오류가 발생합니다.

조회수 803회

안녕하세요! 이제 막 파이썬을 배우고 있는 공대생입니다. 나름대로 구글링을 하면서 매달려보았지만 죽어도 안 되네요. 기본이 아직 없어서 그런 것 같습니다.. 도와주시면 정말 감사하겠습니다!!

그럼 질문에 대해 설명드리겠습니다!

여러개의 엑셀파일이 있고 각 파일마다 하나의 큰 행렬이 있습니다. 아래의 코딩은 각 파일의 행렬을 제가 원하는 기준들로 정렬하고 한 열만 남겨 저장하는 코드입니다.

지금 이 코드로는 문제가 없으나 파일 하나만 정렬이 됩니다.

제가 하고자 하는 것은

자동으로(ex. for문) 여러 엑셀파일들을 하나하나 읽어서, 정렬하고, 원하는 한 열만 남기고, 그 열벡터들을 모두 합해서 엑셀파일 개수만큼의 열을 가진 행렬을 만들고자 합니다.

제가 for문을 섞어 쓴 코드를 올리려 했으나 너무 중구난방이어서 실행되는 코드만 이렇게 올립니다. for문을 어떻게 써야 오류가 나지 않을까요?

두서없는 글 읽어주셔서 감사합니다!

import numpy as np
import pandas as pd
import math
import os

path = "./"
file_list = os.listdir(path)
file_list_py = [file for file in file_list if file.endswith(".xlsx")]

data = pd.read_excel(file_list_py[0])

df20 = pd.DataFrame(data)
df20.sort_values(by=['X Location (mm)'], inplace = True)

atan2 = np.arctan2(df20['Y Location (mm)'], df20['Z Location (mm)']) * 180 / np.pi
#arctan2(x, y)는 x가 분자, y가 분모
atan2 = pd.DataFrame(atan2, columns = ['atan2'])
df20 = pd.concat([df20, atan2], axis = 1)

df20yz = df20.loc[:,'Y Location (mm)':'Z Location (mm)']
dist_yz = [math.sqrt((list(df20yz.loc[k,:])[0] ** 2) + (list(df20yz.loc[k,:])[1] ** 2)) for k in range(len(df20yz))]
dist_yz = pd.DataFrame(dist_yz, columns = ['dist_yz'])
df20 = pd.concat([df20, dist_yz], axis = 1)

df20.sort_values(by=['X Location (mm)','dist_yz','atan2'], inplace = True)
df20 = df20.loc[:,'Equivalent (von-Mises) Stress (MPa)']

df20.to_excel('result.xlsx', sheet_name = 'New')
  • 그러니까 엑셀파일 하나가 열벡터 1개라는 의미구요. 결국 목표는 엑셀파일 갯수의 열벡터가 있는 하나의 행렬을 만들고 싶다 이거죠? 정영훈 2020.1.7 17:55

1 답변

  • 어차피 엑셀파일이 없어서 해볼수는 없구요...가공하는 로직이야 잘 되겠지요.

    아래 dataframe concatenation 샘플 참고하세요.

    • 1.csv
    score1
    49
    68
    89
    2
    77
    2
    67
    95
    62
    30
    
    • 2.csv
    score2
    23
    87
    9
    26
    85
    93
    46
    77
    4
    52
    
    • 3.csv
    score3
    15
    45
    59
    26
    47
    1
    87
    45
    75
    44
    
    import glob
    import pandas as pd
    
    file_paths = [path for path in glob.glob('*.csv')]
    data_frames = [pd.read_csv(path) for path in file_paths]
    pd.concat(data_frames, axis=1)
    
        score2  score1  score3
    0   23  49  15
    1   87  68  45
    2   9   89  59
    3   26  2   26
    4   85  77  47
    5   93  2   1
    6   46  67  87
    7   77  95  45
    8   4   62  75
    9   52  30  44
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)