[pandas] 판다스비긴즈

LILO Ghim·2022년 1월 11일
0

pandas


맛만 살짝 봤는데,
이거 뭐지???


일단
django pandas
django pandas dataframe
django pandas dataframe serializer
django pandas query
django restframework with pandas
django pandas Json
django drf pandas Json
.
.
.
.
.

미친듯이 구글링을 했지만,
일단 내 궁금증은 해소되지 않은채
일단 쉘에 쳐보자!


pandas 설치


설치는 아주 간.단.
나는 miniconda 가상환경이니

conda install pandas


pip install pandas


이것도 있는데 안해봐서 모르겠다


이제, tutorial 굴레로 빠져 들어가면 되는데,

10분짜리 > 한 5시간 걸린 듯,,,,,?


응당 tutorial이라 함은 아무 생각없이 따라 치면서 되면 되네? 하는 맛인데,
의미 없지,,,


쉘을 열자

2차 프로젝트 했던 모델을 가져와서 일단 친다. 쉘.

>>> from users.models import *
>>> import pandas as pd
>>> data = Host.objects.all()
>>> df = pd.DataFrame(data)
>>> df
                   0
0    Host object (1)
1    Host object (2)
2    Host object (3)
3    Host object (4)
4    Host object (5)
5    Host object (6)
6    Host object (7)
7    Host object (8)
8    Host object (9)
9   Host object (10)
10  Host object (11)
11  Host object (12)
12  Host object (13)

이렇게 column이 한개인 라인 없는 표처럼 생긴 표가 생긴다

그리고 생각을 한다.
나는 필요한 column만 가져오고 싶은데?
document를 열심히 뒤지다 보니 columns가 보이고 일단 쳐본다

df = pd.DataFrame(data, columns=["career", "title", "longitude"])

안되지???

ValueError: Shape of passed values is (55, 1), indices imply (55, 3)

에러가 생긴다!


놀랍게도 값을 넣어야 하나 라는 생각을 한다? 대단한데?

아니 column이 한 개인데 자꾸 지정을 해줘서 이런건가 싶은 생각을 하고

>>> data=Host.objects.all().values()
>>> df=pd.DataFrame(data, columns=["career", "title", "longitude"])
>>> df
    career                      title   longitude
0       11                      헬스 한판  127.038560
1        1                따스한 햇살아래 요가  127.038560
2        3             크로스 트레이닝 가즈아ㅏㅏ  127.038560
3        6           한달 안에 10kg 빼드림니다  127.043857
4        1  어제와 다른 나를 보고 싶다면 저를 찾아오세요  127.043857
5        7                 재활 치료 합니다~  127.043857
6        5                  필라테스 집중탐구  127.029494
7        2            필라테스로 11자복근 만들기  127.029494
8        7                   PT 합니다.   127.029494
9        4                   원샷 원킬 청소  127.029494
10       9            어라 여기 투명창문이 있네?  127.090577
11      14            집청소 마스터 불러만 주세요  127.090577
12      15               18년 청소만 했습니다  127.090577
13      10              욕실 찌든때 제거 마스터  127.031335

놀랍게도 data가 나온다


여기서, 어떤 column의 값이 같은 data만 얻고 싶다면,
예를 들어 career가 3인 것만 추출한다면,

뭔가 loc를 쓰는 건가 싶어서

>>> df.loc[:, 'career'] = '3'
>>> df
   career                      title   longitude
0       3                      헬스 한판  127.038560
1       3                따스한 햇살아래 요가  127.038560
2       3             크로스 트레이닝 가즈아ㅏㅏ  127.038560
3       3           한달 안에 10kg 빼드림니다  127.043857
4       3  어제와 다른 나를 보고 싶다면 저를 찾아오세요  127.043857
5       3                 재활 치료 합니다~  127.043857
6       3                  필라테스 집중탐구  127.029494
7       3            필라테스로 11자복근 만들기  127.029494
8       3                   PT 합니다.   127.029494
9       3                   원샷 원킬 청소  127.029494
10      3            어라 여기 투명창문이 있네?  127.090577
11      3            집청소 마스터 불러만 주세요  127.090577
12      3               18년 청소만 했습니다  127.090577
13      3              욕실 찌든때 제거 마스터  127.031335

정말 놀랍게도 약 수 천개의 career가 3으로 바뀌는 신비

난 그동안 엑셀로 노가다를 해왔구나

어쨌든 잘못된 데이터이므로,
조금만 생각해보면

>>> df.loc[df['career'] == 3]
    career                 title   longitude
2        3        크로스 트레이닝 가즈아ㅏㅏ  127.038560
20       3            내가 바로 춤신춤왕  127.027694
33       3               당케쉔 독일어  126.970495
36       3               오하요 일본어  127.027694
43       3            포토샵 알려드립니다  127.046370
50       3                    ㅎㅇ  126.928262
51       3  음악은 나라에서 허용한 마약이다...  126.928262
52       3             에어피앤피 화이팅  126.815355

이렇게 골라낼 수 있다
python이잖아? 생각 안해?

이제 문제는
JSON으로 반환 하는 것이 문제!

df.to_json


삽질 끝에 투제이슨을 발견했지만

orient="columns"
orient="table"

등을 거치다가 document의 수 많은(?) 속성을 파악하기엔 나는 너무 미약하므로,
스택오버플로우형님들의 도움을 받아

result = df.to_json(orient="records")
JsonResponse(json.loads(result), safe=False) 조합을 발견!!!

우리가 생각하는 Json형태의 data가 반환이 된다!!!

하지만 여전히, 여기서 drf는 어떻게 되는건지, serializers는 어떻게 되는건지

도통 알 수가 없다

profile
킴릴로

0개의 댓글