반응형

출처

https://stackoverflow.com/questions/11277432/how-can-i-remove-a-key-from-a-python-dictionary

Python dictionary에서 키를 어떻게 없앨 수 있을까요?

dictionary에서 키를 삭제할 때 저는 다음을 사용하였습니다.

if 'key' in my_dict:
    del my_dict['key']

이를 한 줄로 할 수 있는 방법이 있습니까?


16 개의 답변 중 1 개의 답변

dictionary에 키가 있는지 상관없이 삭제하려면, dict.pop()에서 2개의 인자를 사용합니다.

my_dict.pop('key', None)

이는 key가 dictionary에 존재한다면 my_dict[key]를 리턴할 것이며 그렇지 않으면 None을 리턴할 것입니다. 두 번째 파라미터가 특정되지 않았고 (예 my_dict.pop('key')) key가 존재하지 않으면 KeyError 오류가 발생합니다.

존재하는지 보장되는 키를 지우기 위해 다음을 사용할 수 있습니다.

del my_dict['key']

만약 dictionary에 키가 없으면 KeyError 오류가 발생합니다.

반응형
반응형

출처

https://stackoverflow.com/questions/44882063/replace-all-values-with-nan-in-the-dataframe-in-pandas

pandas의 데이터프레임에서 NaN으로 모든 값 대체하기

다음과 같은 작은 데이터프레임(df)이 있습니다.

unique  a     b     c     d 
  0    None  None  None  None
  1    None  None  None  None
  2    None  0132  None  None
  3    None  None  None  0231
  4    None  None  None  None
  5    None  None  0143  None
  6    0121  None  None  None
  7    None  None  None  0432

저는 모든 값을 NaN으로 대체해야 합니다. 저는 df.fillna(np.NAN)의 적용을 시도해 보았지만, 셀에서 숫자가 있는 곳의 값이 변하지 않았습니다. 어떻게 모든 값이 교체되도록 할 수 있을까요? 데이터프레임은 다음처럼 보여야 합니다.

unique  a     b     c     d 
  0    NaN   NaN   NaN   NaN
  1    NaN   NaN   NaN   NaN
  2    NaN   NaN   NaN   NaN
  3    NaN   NaN   NaN   NaN
  4    NaN   NaN   NaN   NaN
  5    NaN   NaN   NaN   NaN
  6    NaN   NaN   NaN   NaN
  7    NaN   NaN   NaN   NaN

3 개의 답변 중 1 개의 답변

np.nan을 대입하기 위해 loc를 사용합니다.

df.loc[:] = np.nan

iloc도 잘 작동합니다.

df.iloc[:] = np.nan
반응형
반응형

출처

https://stackoverflow.com/questions/3743222/how-do-i-convert-a-datetime-to-date

datetime을 date로 변환하는 방법?

어떻게 Python에서 datetime.datetime 객체(예 datetime.datetime.now() 의 리턴 값)를 datetime.date 객체로 변환할 수 있을까요?


8 개의 답변 중 1 개의 답변

date() 메소드를 사용하세요.

datetime.datetime.now().date()
반응형
반응형

출처

https://stackoverflow.com/questions/20198274/how-do-i-clear-cache-with-python-requests

Python Requests로 캐시를 지우려면 어떻게 하나요?

기본으로 파이썬의 requests 패키지는 데이터를 캐시 하나요?

예를 들어

import requests
resp = requests.get('https://some website')

이 응답은 캐시됩니까? 그렇다면 어떻게 지우나요?


5 개의 답변 중 2 개의 답변

'Cache-Control: no-cache' 헤더를 추가합니다.

self.request = requests.get('http://google.com',
                            headers={'Cache-Control': 'no-cache'})

완벽한 답변은 아래 글을 확인하세요.


답변이 늦었지만 python requests요청을 캐시하지 않으므로 대신 Cache-ControlPragma 헤더를 사용해야 합니다.

import requests
h = {
    ...
    "Cache-Control": "no-cache",
    "Pragma": "no-cache"
}
r = requests.get("url", headers=h)
...

HTTP/Headers

Cache-Control
Cache-Control 일반 헤더 필드는 요청과 응답 모두에서 캐싱 메커니즘에 대한 지시문을 지정하는 데 사용됩니다. 캐싱 지시문은 단방향입니다. 즉, 요청에 지정된 지시문이 응답에 동일한 지시문이 제공되어야 함을 의미하지 않습니다.

Pragma
요청-응답 체인을 따라 다양한 영향을 미칠 수 있는 구현별 헤더입니다. Cache-Control 헤더가 아직 존재하지 않는 HTTP/1.0 캐시와의 하위 호환성을 위해 사용됩니다.

지시자

no-cache
캐시된 복사본을 응답(배포)하기 전에 유효성 검사를 위해 원본 서버에 요청을 제출하도록 캐시를 (사용하지 않도록) 강제합니다.

Pragma에 대한 참고 사항:

Pragma는 HTTP 응답에 대해 지정되지 않았으므로 Cache-Control 헤더 필드가 생략된 경우 Cache-Control: no-cache와 동일하게 동작하지만 일반 HTTP/1.1 Cache-Control 헤더를 신뢰할 수 있는 대체품이 아닙니다. 요청. HTTP/1.0 클라이언트와의 역호환성을 위해서만 Pragma를 사용하십시오.

반응형
반응형

출처

Pandas에서 "안티조인, Anti-merge" (Python)

두 개의 데이터프레임에서 같은 이름의 컬럼들 사이에 차이를 선택할 수 있을까요? 제 의미는 X라는 컬럼으로 데이터프레임 A가 있고 X라는 컬럼으로 데이터프레임 B가 있을 때 다음 pd.merge(A, B, on=['X'])을 하면 A와 B의 공통된 X 값을 얻을 수 있습니다만 "공통적이지 않은" 것을 얻을 수 있을까요?


2 개의 답변 중 1 개의 답변

당신은 merge type을 how='outer'indicator=True로 변경할 수 있고 이는 왼쪽/양쪽/오른쪽에만 값들이 있다는 것을 말해주는 컬럼을 추가할 것입니다.

In [2]:
A = pd.DataFrame({'x':np.arange(5)})
B = pd.DataFrame({'x':np.arange(3,8)})
print(A)
print(B)
   x
0  0
1  1
2  2
3  3
4  4
   x
0  3
1  4
2  5
3  6
4  7

In [3]:
pd.merge(A,B, how='outer', indicator=True)

Out[3]:
     x      _merge
0  0.0   left_only
1  1.0   left_only
2  2.0   left_only
3  3.0        both
4  4.0        both
5  5.0  right_only
6  6.0  right_only
7  7.0  right_only

_merge 컬럼에서 머지된 df 결과를 필터처리 할 수 있습니다.

In [4]:
merged = pd.merge(A,B, how='outer', indicator=True)
merged[merged['_merge'] == 'left_only']

Out[4]:
     x     _merge
0  0.0  left_only
1  1.0  left_only
2  2.0  left_only

또한 isin을 사용하여 not 연산으로 B에 있지 않은 값들을 찾을 수 있습니다.

In [5]:
A[~A['x'].isin(B['x'])]

Out[5]:
   x
0  0
1  1
2  2
반응형
반응형

출처

https://stackoverflow.com/questions/7824101/return-http-status-code-201-in-flask

Flask에서 HTTP 상태 코드 201 리턴하기

우리는 API 중 하나를 위해 Flask를 사용하였고 저는 HTTP 응답 201을 리턴하는 방법을 알고 계신 분이 있는지 궁금합니다.

404 같은 오류는 다음과 같이 호출할 수 있습니다.

from flask import abort
abort(404)

하지만 201을 얻으려면

LookupError: no exception for 201

이 문서에서 이것처럼 예외를 생성할 필요가 있습니까?


11 개의 답변 중 1 개의 답변

당신은 아무 HTTP 상태 코드를 리턴할 수 있는 Response를 사용할 수 있습니다.

> from flask import Response
> return Response("{'a':'b'}", status=201, mimetype='application/json')
반응형
반응형

참고주소 : https://stackoverflow.com/questions/6473679/transpose-list-of-lists

리스트의 리스트를 transpose(전치행렬)

다음과 같은 행렬이 있습니다.

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

제가 찾고 있는 결과는 다음과 같습니다.

r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

다음 결과는 아닙니다.

r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

매우 감사합니다.

13개 답변 중 1개

Python 3 :

# 테이블(행렬)이 들쭉날쭉한 경우 가장 짧은 내부 리스트 개수만큼 단락:
list(map(list, zip(*l)))

# 들쭉날쭉한 경우 데이터를 버리지 않고 내부 리스트를 None으로 채웁니다
list(map(list, itertools.zip_longest(*l, fillvalue=None)))

Python 2 :

map(list, zip(*l))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

설명:

진행 상황을 이해하기 위해 알아야 할 두 가지 사항이 있습니다.

  1. zip의 시그너쳐: zip(*iterables) 이것은 zip이 각각 반복 가능한 임의의 개수의 인수를 예상한다는 것을 의미합니다. 예를 들어 zip([1, 2], [3, 4], [5, 6]).
  2. unpack 된 인수 목록: 인수 args의 시퀀스가 주어지면 f(*args)args의 각 요소가 f의 개별 위치 인수가 되도록 f를 호출합니다.
  3. itertools.zip_longest는 내부 리스트의 요소 수가 동일하지 않은 경우(동종) 데이터를 버리지 않고 대신 더 짧은 중첩 목록을 채운 다음 zip 처리를 합니다.

질문 l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]의 입력으로 돌아가면 zip(*l)zip([1, 2, 3], [4, 5, 6], [7, 8, 9])와 같습니다. 나머지는 결과가 튜플의 리스트 대신 리스트의 리스트인지 확인하는 것입니다.

반응형
반응형

참고주소 : https://dev.to/paulasantamaria/change-the-timezone-on-a-heroku-app-2b4

Heroku 앱에서 타임 존(time zone) 변경하기

저는 몇 주 전에 Heroku를 발경하였습니다. 특히 제 팀이 원격으로 개발 환경을 사용하는 무료 플랜이 있기 때문에 당신의 앱을 배포하는 멋진 플랫폼입니다.

최근 저는 새로운 프로젝트 작업을 시작했습니다. 이 특별한 프로젝트에서 주요 연산의 대부분은 날짜와 관련되어 있습니다. 앱은 프론트 엔드를 Angular 5로 만들었고 백 엔드는 Node.js로 만들었습니다.

모든 것은 제 로컬 환경에서 완벽히 작동하였지만 제가 Heroku로 배포하였을 때 모든 날짜 연산은 임의로 작동하기 시작하였습니다.(스포일러: 랜덤은 아닙니다)

여기에 방법이 있습니다. 저는 아르헨티나 출신이고, 로컬 서버에서 배포된 프론트 엔드가 있지만 백엔드는 Heroku에 있고 새로운 Heroku 앱의 기본 지역은 "미국(us)" 이었습니다. 기본적으로 제 프론트 엔드와 백 엔드는 다른 타임 존 이었습니다.

운이 좋게도 Heroku는 우리에게 새로운 설정 변수를 추가함으로서 우리의 앱의 타임 존을 변경할 수 있도록 합니다.

Heroku CLI에서

  1. 명령어 shell을 엽니다.
  2. Heroku로 로그인 합니다.
  3. 당신의 앱 디렉터리를 찻습니다.
  4. 다음처럼 TZ를 설정합니다.
heroku config:add TZ="America/Argentina/Buenos_Aires"

Heroku dashboard(web)에서

  1. 브라우저에서 Heroku dashboard로 로그인 합니다.
  2. 앱을 찻습니다.
  3. Settings 탭을 클릭합니다.
  4. "Reveal Config Vars" 버튼을 누릅니다.
  5. "TZ"를 키로 설정하고 타입 존의 값(예:America/Argentina/Buenos_Aires)을 설정합니다.
  6. Add(추가) 버튼을 누릅니다.

올바른 TZ값인지 어떻게 알 수 있나요

다음 링크에서 타임 존의 전체 목록을 확인할 수 있습니다.

새로운 TZ 값 확인하기

Heroku CLI에서 새로운 설정 변수의 값을 다음 명령어로 확인할 수 있습니다.

heroku config:get TZ

Heroku에 대한 더 많은 정보

Heroku가 무엇입니까?

Heroku 설정 변수에 대한 더 많은 정보

설정 변수

반응형
반응형

CentOS 6 ca-certificates 패키지 수동 설치

수동 설치 shell

문제점

# vi CentOS-Base.repo
[base]
...
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
[updates]
...
baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/
[extras]
...
baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/
  • 위에처럼 변경하였지만 다음과 같이 SSL 접속에 문제가 발생하였습니다.
# yum install openssh-clients
http://vault.centos.org/centos/6/os/x86_64/repodata/repomd.xml: [Errno 14] problem making ssl connection

해결과정

  • yum으로 패키지를 설치할 수가 없어서 rpm 파일을 https://vault.centos.org 에서 직접 다운로드 받아 설치하는 방법을 사용하였습니다.

  • CentOS 6.10 기준으로 찾아 보았고 다음 주소에서 rpm 파일들을 찾기 시작하였습니다.

  • SSL 문제로 wget 프로그램을 통해 --no-check-certificate 옵션을 추가하여 rpm 파일을 다운로드 받았습니다.

  • rpm 프로그램을 실행하면서 패키지를 다운로드 받았습니다. 그 결과 위에처럼 수동 설치 shell을 만들 수 있었습니다.

#!/bin/bash
wget https://vault.centos.org/6.10/os/x86_64/Packages/ca-certificates-2018.2.22-65.1.el6.noarch.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/p11-kit-0.18.5-2.el6_5.2.x86_64.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/p11-kit-trust-0.18.5-2.el6_5.2.x86_64.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/libtasn1-2.3-6.el6_5.x86_64.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/nss-3.36.0-8.el6.x86_64.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/nss-sysinit-3.36.0-8.el6.x86_64.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/nss-tools-3.36.0-8.el6.x86_64.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/nspr-4.19.0-1.el6.x86_64.rpm  --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/nss-softokn-3.14.3-23.3.el6_8.x86_64.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/nss-util-3.36.0-1.el6.x86_64.rpm --no-check-certificate
wget https://vault.centos.org/6.10/os/x86_64/Packages/nss-softokn-freebl-3.14.3-23.3.el6_8.x86_64.rpm --no-check-certificate

rpm -Uvh ca-certificates-2018.2.22-65.1.el6.noarch.rpm p11-kit-0.18.5-2.el6_5.2.x86_64.rpm p11-kit-trust-0.18.5-2.el6_5.2.x86_64.rpm libtasn1-2.3-6.el6_5.x86_64.rpm nss-3.36.0-8.el6.x86_64.rpm nss-sysinit-3.36.0-8.el6.x86_64.rpm nss-tools-3.36.0-8.el6.x86_64.rpm nspr-4.19.0-1.el6.x86_64.rpm nss-softokn-3.14.3-23.3.el6_8.x86_64.rpm nss-util-3.36.0-1.el6.x86_64.rpm nss-softokn-freebl-3.14.3-23.3.el6_8.x86_64.rpm

Discussion

Windows XP 처럼 업데이트를 더 이상 지원하지 않는 CentOS 6을 사용하는 것의 어려움을 느꼈습니다. 최신 버전의 운영체제를 사용하는 것이 필요하다고 뼈저리게 느꼈습니다.
업데이트를 더 이상 지원하지 않는 CentOS의 패키지를 https://vault.centos.org 에서 다운로드 받을 수 있었습니다. CentOS 6보다 더 낮은 버전의 패키지도 있다는 점이 놀라웠고 좋았습니다. 위 홈페이지도 오래동안 유지되면 좋겠습니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/39993238/vlookup-between-2-pandas-dataframes

2개의 Pandas 데이터프레임 간에 vlookup

다음처럼 2개의 Pandas 데이터 프레임이 있습니다.

DF1:

Security     ISIN
ABC           I1 
DEF           I2
JHK           I3
LMN           I4
OPQ           I5

DF2:

ISIN      Value
 I2        100
 I3        200
 I5        300

저는 다음처럼 보이는 결국 세번째 데이터프레임을 얻고 싶습니다.

DF3:

Security   Value
 DEF       100
 JHK       200
 OPQ       300

2개의 답변 중 1개

당신은 기본으로 inner join에 의해 merge를 사용할 수 있습니다. how=inner는 제외되고 두 DataFrames에서 공통 열만 있다면, 당신은 파라미터 on=ISIN을 제외할 수 있습니다.

df3 = pd.merge(df1, df2)
#ISIN 열 제거
df3.drop('ISIN', axis=1, inplace=True)
print (df3)
  Security  Value
0      DEF    100
1      JHK    200
2      OPQ    300

또는 df1로부터 Series에 의한 ISIN 열을 map을 호출할 수 있습니다.

print (df1.set_index('ISIN')['Security'])
ISIN
I1    ABC
I2    DEF
I3    JHK
I4    LMN
I5    OPQ
Name: Security, dtype: object

#df2를 복사하여 새로운 df를 생성
df3 = df2.copy()
df3['Security'] = df3.ISIN.map(df1.set_index('ISIN')['Security'])
#ISIN열을 없앰
df3.drop('ISIN', axis=1, inplace=True)
#열의 순서를 변경
df3 = df3[['Security','Value']]
print (df3)
  Security  Value
0      DEF    100
1      JHK    200
2      OPQ    30
반응형

+ Recent posts