Xp
Free-Talk
파이썬 질문, 데이터프레임(시리즈) 이름 연속으로 정하기?
 
1
  665
Updated at 2020-11-22 23:11:13

데이터를 다운 받아서 파이썬으로 분석할 일이 있습니다

그런데 데이터가 조각조각 여러 개라서 매번 불러오는 게 귀찮더라고요 

혹시 어떻게 하면 for 문을 써서 자료를 불러오고 연속적으로 데이터프레임 변수할당을 할 수 있을까요?

 

 

예를 들어

df1 = pd.read_csv('data1.csv')

df2 = pd.read_csv('data2.csv')

df3 = pd.read_csv('data3.csv')

....

df50 = pd.read_csv('data3.csv')

이 작업을 하고 싶은 겁니다. 

 

for i in range(1, 51):

df i = ...

이런 식으로는 안 될 것 같더라고요

저렇게 Series나 DataFrame의 이름을 연달아 짓는 방법은 없을까요? 

14
Comments
2020-11-22 23:14:24

저도 고민했던 것 같은데, 다따로 하는건 못찾았던것 같네요.

os.lisdir() 인가 이걸로 file_list = ['data1.csv', ..., 'data2.csv'] 해서

sum_file = []

for file in file_list:

sum_file.append(file)

 

이렇게해서 sum_file을 데이터프레임으로 불러들이는건 가능했던 것 같기도 합니다.

WR
2020-11-22 23:57:30

os.listdir()은 처음 들어봤네요

한 번 말씀하신대로 사부작사부작 해보겠습니다

도움주셔서 감사합니다

1
Updated at 2020-11-22 23:42:58

방법은 여러가지가 있겠지만, 얼마나 큰 데이터를 다루는 지 몰라서 일단 간단하게 해봤습니다.

다음과 같이 두 개 파일이 있다고 가정할께요.

❯ cat ~/Downloads/test_csv_file_1.csv

ID,LAST_NAME,AGE

4,PARK,19

5,LIM,36


❯ cat ~/Downloads/test_csv_file_2.csv

ID,LAST_NAME,AGE

1,KIM,30

2,CHOI,25

3,LEE,41 

 

그럼 이렇게 하면 하나의 dataframe에 위 파일의 내용이 들어갑니다.

>>> dfs = []

>>> for i in range(1, 3):

...     dfs.append(pd.read_csv(f'~/Downloads/test_csv_file_{i}.csv'))

...

>>> df = pd.concat(dfs)

>>> df

   ID LAST_NAME  AGE

0   4      PARK   19

1   5       LIM   36

0   1       KIM   30

1   2      CHOI   25

2   3       LEE   41

 

연속된 dataframe만 사용하고 싶다면 그냥 저렇게 list에 넣을 수도 있고, 필요에 따라 여러가지 방법이 있을텐데 본문 내용만으로는 뭐가 필요한건지 정확히 모르겠어서 그냥 가장 간단한 방법으로 해봤습니다.

WR
Updated at 2020-11-23 00:19:33

반복하는 i를 {i}를 format? 형식으로 쓸 수 있군요? 처음 알았습니다

구체적으로 말씀드리면, 제게 매일 시가총액 관련 자료를 1년 단 파일이 있습니다.

1년 자료를 30년 갖고 있다보니 매번 불러들이고, 

특정기간 마다 데이터를 병합하는 게 너무 귀찮게 느껴지더라고요

그래서 일정한 규칙으로 변수를 할당하고 싶었습니다

(더 구체적으로는 제가 갖고 있는 데이터 값이 123,456,789 이런 식으로 되어 있는데

pd.to_numeric('data1[mktcap]') 이런 식으로 하니까 콤마 때문에 숫자로 안 바뀌더라고요..

그래서 이걸 string으로 바꾸어 콤마를 기준으로 split하는데 

다시 문자를 숫자로 바꾸는 명령문이 너무 번거롭게 느껴졌습니다) 

제가 너무 초보라 횡설수설하는 건 죄송합니다...

 

 

 

1
2020-11-23 00:38:12

1. 매일의 시가총액 데이터가 1년 단위 파일로 있고, 이 자료가 30년치 만큼 있다는 뜻인가요?

 

2. 특정기간마다 데이터를 병합한다는 건 특정 기간마다 해당 시점에서 x기간만큼의 데이터를 가져와야 한다는 뜻인가요? 예를 들어 올해 11.01에 이전 1년치 자료, 올해 11.10에 이전 1년치 자료, ..를 가져와 작업을 한다는 뜻인가요?

 

3. 시가총액 데이터의 숫자값이 123,456,789의 string형식인데, 데이터 처리를 위해 숫자로 변환이 필요하단 뜻인가요? 물론 읽으면서 변환을 해도 되겠지만, 그게 당장 안된다면 이건 미리 한 번 변환해두고 쓰면 될텐데요. 시가총액이란 게 집계 후에는 바뀔 일이 없으니까요. 미리 변환을 하라고 말씀을 드리는 이유는 이 값이 csv 형식인데, 데이터에도 comma가 있기 때문입니다. 실제 데이터가 어떻게 저장된 지는 모르겠지만, csv의 column 구분자가 comma인데 데이터에도 comma가 있으면 데이터를 읽을 때 오류가 발생할 수도 있으니까요. 만약 데이터가 다음과 같이 해당 column이 ", "로 묶여있는 경우 다음과 같이 숫자로 바꿔줄 수는 있습니다.

>>> import pandas as pd

>>> pd.read_csv('~/Downloads/test_csv_file_1.csv')

   ID LAST_NAME  AGE   SALARY

0   4      PARK   19  100,500

1   5       LIM   36  190,000

>>> df = pd.read_csv('~/Downloads/test_csv_file_1.csv')

>>> df['SALARY'] = df['SALARY'].str.replace(',', '')

>>> df['SALARY'].apply(pd.to_numeric)

0    100500

1    190000

Name: SALARY, dtype: int64

WR
Updated at 2020-11-24 02:47:57

1. 그렇습니다

2. 예를 들어 금융위기 구간인 하나는 2007년 4월 2일부터 2009년 6월 30일까지, 다른 하나는 COVID-19 구간인 200120 ~ 현재까지 이런 식으로 병합한다는 뜻이었습니다.

 

3. 제가 너무 바보 같이 접근했었네요 ㅠㅠ 

굳이 나누고 다시 합치고... 콤마 개수에 맞추어 IF문 써서 열 개수도 따로 만들어주는.....

허허헣 허탈함과 동시에 저의 부족함을 많이 느낍니다

 

덕분에 문제도 해결하고 좋은 코드 알려주셔서 감사드립니다

여러모로 많은 걸 알 수 있었습니다

정말 감사드립니다 

1
2020-11-22 23:55:49

 exec 커맨드를 알아보세요. string 을 명령으로 실행하게 해줍니다. 

 

예를 들면

 

for i in range(50):

  cmd = "df"+str(i)+"= pd.read_csv('data"+str(i)+".csv')"

  exec(cmd)

 

하시면 됩니다. 


WR
2020-11-23 00:20:51

exec는 또 처음 들어보는 명령이네요

하 참.. 정말 초보군요 저는 ㅠㅠ

한 번 해보겠습니다. 알려주셔서 정말 감사합니다 

1
2020-11-22 23:56:24

딕셔너리 정의하고 df{i}=pd.read_csv 이렇게 해보세요

WR
Updated at 2020-11-23 00:25:59

중괄호{}안에 넣으면 for문에서도 형식이 유지가 되는가보군요?

실례를 무릅쓰고

혹시 간단한 data1, data2, data3를 

df1, df2, df3 또는 df['c1'] df['c2'], df['c3']에 할당하는 코드를 한 번만 써주시겠어요...?

1
2020-11-23 08:54:15

아랫분이 잘 써 주셨네요. 파일이름이 규칙성이 없다면 file_list=sorted(os.listdir(filelist))로 정렬하시고 df{i}=pd.read_csv(file_list[i]) 이런 방식으로 불러오면 될 것 같습니다.

WR
2020-11-24 02:39:46

그렇군요, 말씀하신 방법에 따라 직접 해봐야겠습니다

정성스러운 답변 감사합니다!

1
Updated at 2020-11-23 02:42:13

동적 변수 할당은 딕셔너리로 하시면 깔끔합니다.

 

dataset = {}   # 빈 사전을 하나 미리 만들어놓고

 

for i in range(1, 51):   # for 문 안에서 사전의 key를 번호순서대로 만들어 csv 파일을 할당해줍니다

    file_key = 'df' + str(i)

    filename = 'data' + str(i) + '.csv'

    dataset[file_key] = pd.read_csv(filename)

 

이런식으로 해보시면 어떨까요. 저렇게 하면 dataset 사전 안에 각각의 key로 csv 파일들이 읽어져 있을거고, 필요할때 dataset['df1'] 식으로 사전의 key를 불러와서 쓰시면 됩니다.

 

아 물론 파일 이름이 이미 순차적으로 data1.csv, data2.csv ~ data50.csv 등으로 준비되어 있는 경우에만 가능하겠고, 임의의 파일들인 경우에는 os.listdir() 등으로 파일 이름을 리스트로 읽어와서 나름대로 sorting 해준 후에 작업을 해야될수도 있겠지만요.

WR
2020-11-24 02:41:18

이런 걸 동적변수 할당이라고 일컫는군요

제가 데이터를 저장할 때는 규칙적으로 했었습니다. 이런 방식은 처음이라 조금 더 익숙해져야겠습니다

상세하고 친절한 설명 정말 감사드립니다. 덕분에 많이 알아갑니다

글쓰기
검색 대상
띄어쓰기 시 조건