programing

pyspark 데이터 프레임에 고유한 열 값 표시

batch 2023. 6. 20. 21:27
반응형

pyspark 데이터 프레임에 고유한 열 값 표시

Pyspark 데이터 프레임을 사용하여 Panda와 동등한 성능을 발휘하는 방법은 무엇입니까?df['col'].unique().

저는 pyspark 데이터 프레임 열에 있는 모든 고유 값을 나열하고 싶습니다.

SQL 유형 방식이 아닙니다(템플릿을 등록한 후 SQL 쿼리를 통해 고유한 값을 확인).

그리고 나는 필요 없습니다.groupby그리고나서countDistinct대신에 저는 그 열에서 고유한 값을 확인하고 싶습니다.

이렇게 하면 열의 고유한 값을 얻는 데 도움이 됩니다.

df.select('column1').distinct().collect()

참고:.collect()반환할 수 있는 값 수에 대한 기본 제공 제한이 없기 때문에 속도가 느릴 수 있습니다..show()대신 또는 추가.limit(20)전에.collect()이를 관리하기 위해.

다음과 같은 데이터 표현(두 개의 열,k그리고.v,어디에k에는 고유한 두 개의 세 개의 항목이 포함됩니다.

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|bar|  2|
|foo|  3|
+---+---+

Panda 데이터 프레임의 경우:

import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()

이것은 다음을 반환합니다.ndarray,예.array(['foo', 'bar'], dtype=object)

"Pandersdf['col'을 위한 pyspark 데이터 프레임 대안"을 요청하셨습니다.독특한"이제 다음 스파크 데이터 프레임이 주어집니다.

s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))

스파크에서 동일한 결과를 원한다면, 즉ndarray,사용하다toPandas():

s_df.toPandas()['k'].unique()

또는 필요하지 않은 경우ndarray구체적으로 그리고 단지 열의 고유 값 목록을 원합니다.k:

s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()

마지막으로 목록 이해도 다음과 같이 사용할 수 있습니다.

[i.k for i in s_df.select('k').distinct().collect()]

사용할 수 있습니다.df.dropDuplicates(['col1','col2'])배열에서 colX를 기준으로 고유한 행만 가져옵니다.

데이터 프레임에서 특정 열의 고유한 값을 보려면 다음 코드를 작성하면 됩니다.100개의 고유한 값을 표시합니다(100개의 값을 사용할 수 있는 경우).colname의 란df데이터 프레임

df.select('colname').distinct().show(100, False)

고유한 값을 원하는 경우 벡터에 고유한 값을 저장할 수 있습니다.

a = df.select('colname').distinct()

collect_set의 주어진 열에서 고유한 값을 얻는 데 도움이 될 수 있습니다.pyspark.sql.DataFrame:

df.select(F.collect_set("column").alias("column")).first()["column"]

할 수 있습니다

distinct_column = 'somecol' 

distinct_column_vals = df.select(distinct_column).distinct().collect()
distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]

다른 답변과 유사하지만 질문은 행 개체를 반환하는 것이 아니라 실제 값을 반환하는 것 같습니다.

이상적인 원라이너는df.select('column').distinct().collect().toPandas().column.to_list().collect(.collect)를 실행하는 것이 메모리에 비해 그리 크지 않을 것이라고 가정합니다.

추천합니다df.select('column').distinct().count()먼저 크기를 측정하고 너무 크지 않은지 확인합니다.

옵션 외에도 drop_duplicates다음과 같은 방법이 있습니다.

drop_duplates()dropDuplates()의 별칭입니다.

s_df = sqlContext.createDataFrame([("foo", 1),
                                   ("foo", 1),
                                   ("bar", 2),
                                   ("foo", 3)], ('k', 'v'))
s_df.show()

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|foo|  1|
|bar|  2|
|foo|  3|
+---+---+

부분 집합으로 놓기

s_df.drop_duplicates(subset = ['k']).show()

+---+---+
|  k|  v|
+---+---+
|bar|  2|
|foo|  1|
+---+---+
s_df.drop_duplicates().show()


+---+---+
|  k|  v|
+---+---+
|bar|  2|
|foo|  3|
|foo|  1|
+---+---+

데이터 프레임(df)에서 모든(열) 데이터를 구별하여 선택하려면,

df.select('*').distinct().show(10,truncate=False)

먼저 실행

df.createOrReplaceTempView('df')

그럼 실행

spark.sql("""
    SELECT distinct
        column name
    FROM
        df
    """).show()

저는 이것이 가장 직관적인 (즉, 판다와 유사한) 구문이라고 생각합니다.

new_df = df[['col']].distinct() # returns a one-column pyspark dataframe

또는

new_col = df[['col']].distinct()['col'] # returns a pyspark column object. 

필요한 목록으로 이동하려면 다음과 같이 하십시오.

new_list = df[['col']].distinct().rdd.map(lambda row: row.col).collect()

을 ""DataFrame"이라고 .df그런 다음 다음을 사용할 수 있습니다.

df1 = df.groupBy('column_1').agg(F.count('column_1').alias('trip_count'))
df2 = df1.sort(df1.trip_count.desc()).show()

이것은 도움이 될 수 있습니다.

df.select(collect_set("your column")).show()

언급URL : https://stackoverflow.com/questions/39383557/show-distinct-column-values-in-pyspark-dataframe

반응형