여러 열에 조건이 지정된 데이터 프레임을 필터링하려고합니다. 문제는 조건이 열 값에 따라 변경된다는 것입니다.
예를 들어 다음과 같은 원시 데이터 세트가 있습니다.
df_assets = pd.DataFrame(
{'asset_id': ['10092', '39883', '82883', '28883', '09093', '27817', '38261', '28372', '38472', '39738'],
'asset_type' :['laptop', 'mousepad', 'mouse', 'pen', 'pen', 'monitor', 'wire', 'laptop', 'keyboard', 'mouse'],
'quantity': [3, 12, 12, 10, 2, 0, 21, 0, 10, 16],
'assigned': ['susan', 'jane', 'amy', 'ben', 'donald', 'evan', 'chris', 'fred', 'henry', 'george']
})
+--------+----------+--------+--------+
|asset_id|asset_type|assigned|quantity|
+--------+----------+--------+--------+
| 10092| laptop| susan| 3.0|
| 39883| mousepad| jane| 12.0|
| 82883| mouse| amy| 12.0|
| 28883| pen| ben| 10.0|
| 09093| pen| donald| 2.0|
| 27817| monitor| evan| 0.0|
| 38261| wire| chris| 21.0|
| 28372| laptop| fred| 0.0|
| 38472| keyboard| henry| 10.0|
| 39738| mouse| george| 16.0|
+--------+----------+--------+--------+
다음 사전에 명시된 것보다 더 많은 수량의 행을 반환하는 필터를 적용하고 싶습니다 (예 : 수량> = 10 인 키보드, 수량> = 10 인 와이어, 수량> = 1 인 노트북 등). 또한 사전에 지정된 자산 유형을 포함하지 않는 행을 반환하고 싶습니다.
d = {'keyboard': 10, 'wire': 20, 'laptop': 1, 'mouse': 15, 'monitor': 1}
출력은
+--------+----------+--------+--------+
|asset_id|asset_type|assigned|quantity|
+--------+----------+--------+--------+
| 10092| laptop| susan| 3.0|
| 38261| wire| chris| 21.0|
| 39738| mouse| george| 16.0|
| 38472| keyboard| henry| 10.0|
| 39883| mousepad| jane| 12.0|
| 28883| pen| ben| 10.0|
| 09093| pen| donald| 2.0|
+--------+----------+--------+--------+
이를 수행하는 우아한 방법이 있습니까? 딕셔너리의 각 항목에 대한 데이터 프레임을 필터링 및 생성하고 최종 데이터 프레임에 추가하여 위의 내용을 구현했습니다.
count = 0
for k, v in d.items():
sdf_filter = sdf_assets.filter( (f.col('asset_type') == k) & (f.col('quantity') >= v) )
if count != 0:
sdf_thresholded = sdf_thresholded.union(sdf_filter)
else:
sdf_thresholded = sdf_filter
count += 1
sdf_result_test = sdf_thresholded.union(sdf_assets.filter(~f.col('asset_type').isin(d.keys())))
전체 데이터 세트에 많은 항목이 있기 때문에 PySpark에서 모든 것을 작성했지만 파이썬의 모든 솔루션을 고맙게 생각합니다!
먼저 사전 d
을 Spark DataFrame으로 변환하십시오 .
d = {'keyboard': 10, 'wire': 20, 'laptop': 1, 'mouse': 15, 'monitor': 1}
d = spark.createDataFrame(d.items(), ["asset_type", "min_quantity"])
d.show()
#+----------+------------+
#|asset_type|min_quantity|
#+----------+------------+
#| laptop| 1|
#| wire| 20|
#| mouse| 15|
#| monitor| 1|
#| keyboard| 10|
#+----------+------------+
이제 df_assets
DataFrame을 시작 하여 이것을 LEFT 조인 하고 where
조건에 따라 행을 필터링하는 데 사용할 수 있습니다. d
크기가 작기 때문에 성능 향상을 위해 broadcast
조인 을 사용할 수 있습니다 .
from pyspark.sql.functions import broadcast
# first convert from pandas DataFrame to spark DataFrame
df_assets = spark.createDataFrame(df_assets)
# left join with d
df_assets.join(broadcast(d), on="asset_type", how="left")\
.where("min_quantity IS NULL or quantity >= min_quantity")\
.select("asset_id", "asset_type", "assigned", "quantity")\
.show()
#+--------+----------+--------+--------+
#|asset_id|asset_type|assigned|quantity|
#+--------+----------+--------+--------+
#| 10092| laptop| susan| 3|
#| 39883| mousepad| jane| 12|
#| 28883| pen| ben| 10|
#| 09093| pen| donald| 2|
#| 38261| wire| chris| 21|
#| 38472| keyboard| henry| 10|
#| 39738| mouse| george| 16|
#+--------+----------+--------+--------+
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다