저는 몇가지 검색을 수행했지만 df["col"].str.contains(word)로 데이터프레임을 제외하는 방법을 알 수 없습니다. 하지만, 저는 contains를 반대로 수행할 방법, 즉 데이터프레임의 여집합을 구하는 방법이 있는지 궁금합니다. 예: !(df["col"].str.contains(word)) 의 효과
DataFrame 방법을 통해 할 수 있는 방법이 있을까요?
6개의 답변
(불리언 데이터에서 not처럼 실행하는) 반전(invert, ~) 연산자를 사용할 수 있습니다.
new_df = df[~df["col"].str.contains(word)]
new_df는 RHS에 의해 복사되는 곳입니다.
contains는 정규 표현식도 받아 들입니다.
만약 위에서 ValueError가 발생하면 그 이유는 여러 타입이 섞인 데이터 타입이라 그렇고 na=False를 사용합니다.
To run spark in Colab, we need to first install all the dependencies in Colab environment i.e. Apache Spark 2.3.2 with hadoop 2.7, Java 8 and Findspark to locate the spark in the system. The tools installation can be carried out inside the Jupyter Notebook of the Colab. One important note is that if you are new in Spark, it is better to avoid Spark 2.4.0 version since some people have already complained about its compatibility issue with python. Follow the steps to install the dependencies:
Colab에서 스파크를 실행하려면 먼저 모든 종속성을 Colab 환경에 설치해야 합니다 (예 : Apache Spark 2.3.2 with hadoop 2.7, Java 8 및 Findspark)는 시스템에서 스파크를 찾습니다. 도구 설치는 Colab의 Jupyter 노트북 내에서 수행할 수 있습니다. 한 가지 중요한 참고 사항은 Spark를 처음 사용하는 경우 일부 사람들이 이미 Python과의 호환성 문제에 대해 불평했기 때문에 Spark 2.4.0 버전을 피하는 것이 좋습니다. 다음 단계에 따라 종속성을 설치하십시오.
Now that you installed Spark and Java in Colab, it is time to set the environment path which enables you to run Pyspark in your Colab environment. Set the location of Java and Spark by running the following code:
이제 Colab에 Spark와 Java를 설치 했으므로 Colab 환경에서 Pyspark를 실행할 수 있는 환경 경로를 설정할 차례입니다. 다음 코드를 실행하여 Java 및 Spark의 위치를 설정합니다.
In [5]:
import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-2.4.7-bin-hadoop2.7"
Run a local spark session to test your installation:
로컬 스파크 세션을 실행하여 설치를 테스트합니다.
In [6]:
import findspark
findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").getOrCreate()
This is a short introduction to Koalas, geared mainly for new users. This notebook shows you some key differences between pandas and Koalas. You can run this examples by yourself on a live notebook here. For Databricks users, you can import the current .ipynb file and run it after installing Koalas.
이것은 주로 신규 사용자를 대상으로 한 Koalas에 대한 짧은 소개입니다. 이 노트북은 pandas와 Koalas의 몇 가지 주요 차이점을 보여줍니다. 여기에서 라이브 노트북에서 직접이 예제를 실행할 수 있습니다. Databricks 사용자의 경우 현재 .ipynb 파일을 가져와 Koalas를 설치 한 후 실행할 수 있습니다.
Creating Koalas DataFrame from Spark DataFrame. to_koalas() is automatically attached to Spark DataFrame and available as an API when Koalas is imported.
Spark 데이터프레임으로부터 코알라 데이터프레임을 생성합니다. to_koalas()는 자동으로 Spark 데이터프레임에 접근하여 Koalas를 가져올 때 API로 사용할 수 있습니다.
In [24]:
kdf = sdf.to_koalas()
In [25]:
kdf
Out[25]:
A
B
C
D
0
0.246792
0.536389
0.292430
-0.593033
1
-0.134876
1.100264
-0.311183
0.923779
2
0.137727
0.105094
-0.970088
0.584534
3
-0.245857
2.213910
1.932763
0.803901
4
-0.497545
0.541320
-0.323730
-0.454794
5
0.357657
-0.778258
-0.135661
0.905264
Having specific dtypes . Types that are common to both Spark and pandas are currently supported.
특정 dtypes가 있습니다. 현재 Spark 및 pandas에서 공통적으로 가지는 Type이 지원됩니다.
See the top rows of the frame. The results may not be the same as pandas though: unlike pandas, the data in a Spark dataframe is not ordered, it has no intrinsic notion of index. When asked for the head of a dataframe, Spark will just take the requested number of rows from a partition. Do not rely on it to return specific rows, use .loc or iloc instead.
프레임의 최상단 몇개의 행을 확인합니다. 결과는 pandas와 똑같지 않을 수 있습니다. pandas와는 다르게 Spark 데이터프레임의 데이터는 정렬되지 않으며 인덱스에 대한 본질적인 개념이 없습니다. dataframe의 head를 요청하면 Spark는 파티션으로부터 요청한 행의 개수를 가져(take)옵니다. 특정 행을 반환하는 데 의존하지 않으며 대신 .loc나 .iloc를 사용하세요.
In [27]:
kdf.head()
Out[27]:
A
B
C
D
0
0.246792
0.536389
0.292430
-0.593033
1
-0.134876
1.100264
-0.311183
0.923779
2
0.137727
0.105094
-0.970088
0.584534
3
-0.245857
2.213910
1.932763
0.803901
4
-0.497545
0.541320
-0.323730
-0.454794
Display the index, columns, and the underlying numpy data.
You can also retrieve the index; the index column can be ascribed to a DataFrame, see later
인덱스, 열(컬럼), 기본 numpy 데이터를 표시합니다.
인덱스를 받을 수도 있습니다. 인덱스 열은 데이터프레임에 속할 수 있습니다. 나중에 확인해 보겠습니다.
Various configurations in PySpark could be applied internally in Koalas. For example, you can enable Arrow optimization to hugely speed up internal pandas conversion. See PySpark Usage Guide for Pandas with Apache Arrow.
prev = spark.conf.get("spark.sql.execution.arrow.enabled") # Keep its default value. 기존 값을 유지
ks.set_option("compute.default_index_type", "distributed") # Use default index prevent overhead. 오버헤드 방지를 위해 기본 index 사용
import warnings warnings.filterwarnings("ignore") # Ignore warnings coming from Arrow optimizations. Arrow 최적화에서 오는 warning 무시하기.
The slowest run took 4.29 times longer than the fastest. This could mean that an intermediate result is being cached. 1 loop, best of 3: 286 ms per loop
In addition, Koalas fully support Spark's various datasources such as ORC and an external datasource. See here to write it to the specified datasource and here to read it from the datasource.
추가적으로 코알라는 ORC나 외부 데이터소스 같은 Spark의 다양한 데이터소스를 완전 지원합니다. 특정 데이터소스로 쓰기 위해서 여기를 확인 하시고 특정 데이터소스로부터 읽기 위해서 여기를 확인해 주세요.
저는 worker의 pool을 사용하여 파이썬의 멀티프로세싱 라이브러리를 구현하고 있습니다. 저는 다음 코드를 구현하였습니다.
import main1
t1 = time.time()
p = Pool(cores)
result = p.map(main1, client_list[client])
if result == []:
return []
p.close()
p.join()
print "Time taken in performing request:: ", time.time()-t1
return shorted(result)
하지만, 프로세스를 실행한 후에 저의 응용프로그램에 백그라운드 프로세스가 많이 나왔습니다. 저의 응용프로그램에 ps aux를 실행한 후에 스냅샷입니다.
Stackoverflow에서 멀티프로세싱 모듈에 의해 생성된 좀비 프로세스를 죽이는 방법 같은 비슷한 질문을 많이 읽었습니다. 이미 구현한 .join()을 사용해야 하며 여기에서 Python Multiprocessing Kill Processes에서 이러한 모든 프로세스를 종료하는 방법을 배웠습니다. 그러나 제 코드에 무엇이 잘못 될 수 있는지 알고 싶습니다. main1 함수에서 모든 코드를 공유할 수는 없지만 main 코드의 오류로 인해 좀비 프로세스가 발생할 수 있는 경우를 피하기 위해 try catch 블록에 전체 코드 블록을 넣었습니다.
def main1((param1, param2, param3)):
try:
resout.append(some_data) # 오류가 없는 경우 resout
except:
print traceback.format_exc()
resout = [] # 오류가 발생한 경우 비어 있는 resout 리턴
return resout
저는 병렬 프로그래밍 및 디버깅 문제라는 개념에 대해 아직 매우 신입이고 매우 까다롭습니다. 어떤 도움이든 매우 감사하겠습니다.
1개의 답변
보통 가장 보편적인 문제는 pool이 생성되었지만 닫지 않는 것입니다.
제가 알고있는 최고의 방법은 try/finally 구문을 사용하여 pool이 닫히도록 보장하는 것 입니다.
try:
pool = Pool(ncores)
pool.map(yourfunction, arguments)
finally:
pool.close()
pool.join()
multiprocessing과 싸우고 싶지 않다면, 저는 제 인생(잠재적으로 당신의 인생도)을 더 쉽게 멀티프로세싱을 wrapping 한 parmap이라 불리는 간단한 패키지를 작성하였습니다.
pip install parmap
import parmap
parmap.map(yourfunction, arguments)
여기서부터는 parmap 사용법 입니다.
간단한 병렬처리 예시:
import parmap
y1 = [myfunction(x, argument1, argument2) for x in mylist]
y2 = parmap.map(myfunction, mylist, argument1, argument2)
y1 == y2
튜플의 리스트를 순회하기
# 당신이 원하는 것:
z = [myfunction(x, y, argument1, argument2) for (x,y) in mylist]
z = parmap.starmap(myfunction, mylist, argument1, argument2)
# 당신이 원하는 것:
listx = [1, 2, 3, 4, 5, 6]
listy = [2, 3, 4, 5, 6, 7]
param = 3.14
param2 = 42
listz = []
for (x, y) in zip(listx, listy):
listz.append(myfunction(x, y, param1, param2))
# 병렬로 실행:
listz = parmap.starmap(myfunction, zip(listx, listy), param1, param2)
저는 다음 방법으로 나쁜 요청(requests)에 대해 오류를 발생하는 소스 코드를 읽고 있습니다.
import requests
response = requests.get("www.google.com") # http:// 가 없기 때문에 작동하지 않습니다.
if response.ok is False or response.json()['status'] != 'success':
raise Exception("API error: {}".format(response.json()['message']))
저는 마지막 2줄을 다음 구문으로 대체해야겠다고 생각하였습니다.
response.raise_for_status()
오류가 리턴한 내용에서 차이점을 발견하지 못했습니다. 2가지 모두 다음과 같이 나왔습니다.
Traceback (most recent call last):
File "/home/kurt/Documents/Scratch/requests_test.py", line 3, in <module>
response = requests.get("www.google.com") # This won't work because it's missing the http://
File "/home/kurt/.local/lib/python2.7/site-packages/requests/api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "/home/kurt/.local/lib/python2.7/site-packages/requests/api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "/home/kurt/.local/lib/python2.7/site-packages/requests/sessions.py", line 451, in request
prep = self.prepare_request(req)
File "/home/kurt/.local/lib/python2.7/site-packages/requests/sessions.py", line 382, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/home/kurt/.local/lib/python2.7/site-packages/requests/models.py", line 304, in prepare
self.prepare_url(url, params)
File "/home/kurt/.local/lib/python2.7/site-packages/requests/models.py", line 362, in prepare_url
to_native_string(url, 'utf8')))
requests.exceptions.MissingSchema: Invalid URL 'www.google.com': No schema supplied. Perhaps you meant http://www.google.com?
response.raise_for_status()는 응답의 상태 코드가 200이 아닌 응답일 때만 예외(Exception)를 발생합니다. 두 번째 경우인 response.json()['status'] != 'success'가 만족할 경우, 커버하지 않습니다.
하지만 다른 오류가 있습니다. requests.get() 호출에 의해 예외가 발생하므로 if 테스트에 도달하지 않습니다. 스키마를 전달하지 못했습니다 (문자열 앞에 http:// 또는 https:// 없음). requests.get() 표현식에서 예외가 발생하므로 다음 행은 절대로 실행되지 않습니다. 요청도 전송되지 않으므로 응답에 대한 assertion도 만들 수 없습니다.
테스트는 더 많은 문제가 있습니다.
requests.ok is False 관용적인 파이썬 표현이 아닙니다. 대신에 not requests.ok를 사용하는 것이 좋습니다.
만약 requests.ok is False를 만족하면, requests.json()은 대부분 실패할 것입니다. 그래서 response.json()['message']를 사용한 다음 줄은 다른 오류를 발생할 것입니다.
>>> x = [1,2,3,4,5,6,7,8,9,0]
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> y = [1,3,5,7,9]
>>> y
[1, 3, 5, 7, 9]
>>> y - x # ([2,4,6,8,0]를 리턴해야 합니다.)
이 방법은 파이썬 리스트에서 지원되지 않습니다. 이를 할 수 있는 최고의 방법은 무엇입니까?
12개의 답변 중 2개의 답변만 추려냄
리스트 내포(comprehension)을 사용합니다.
[item for item in x if item not in y]
만약 - 중위 연산 문법을 사용하고 싶으면 다음처럼 할 수 있습니다.
class MyList(list):
def __init__(self, *args):
super(MyList, self).__init__(args)
def __sub__(self, other):
return self.__class__(*[item for item in self if item not in other])
다음처럼 사용할 수 있습니다.
x = MyList(1, 2, 3, 4)
y = MyList(2, 5, 2)
z = x - y
하지만 만약 리스트 속성이 절대적으로 필요하지 않다면(예시, 순서), 다른 답변처럼 set(집합)을 사용하는 것을 추천합니다.