>

데이터 프레임 df 가 있다고

import pandas as pd
df = pd.DataFrame({"id":["a", "b", "aa", "aaa", "bbb", "a"]})

이 경우열 id의 문자열 길이의 수를 계산하려고합니다.

이 예에서는 id 에 3 개의 문자열이 있습니다.  길이 1과 길이 2의 문자열 1, 길이 3의 문자열 2와 함께이 정보를 반영하는 테이블을 만들고 싶습니다

str_length  count
1           3
2           1
3           2

수백만 행에 대해 가장 효율적인 방법은 무엇입니까?

이것은 내가 생각해 낼 수있는 최선이지만 apply 를 사용한다고 들었습니다.  느리다

df_count = df.id.apply(lambda x: len(x)).value_counts()
df_count2 = pd.DataFrame({"str_length": df_count.index.tolist(), "count": df_count})
df_count2.sort_values("str_length")

이것은 양보한다

  str_length  count
1           1      3
2           2      1
3           3      2


  • 답변 # 1

    여러분은

    df.id.str.len().value_counts()
    1    3
    3    2
    2    1
    Name: id, dtype: int64
    
    

  • 답변 # 2

    그룹 및 카운트 사용

    (
        df.groupby(by=df.id.apply(len))
        .id.count()
        .to_frame('count')
        .rename_axis(index='str_length')
        .reset_index()
    )
        str_length  count
    0   1           3
    1   2           1
    2   3           2
    
    

  • 답변 # 3

    numpy 솔루션 :

    np.transpose(np.unique(df.id.map(len), return_counts=True))
    Out[229]:
    array([[1, 3],
           [2, 1],
           [3, 2]], dtype=int64)
    
    
    <시간>

    데이터 프레임 생성

    pd.DataFrame(np.transpose(np.unique(df.id.map(len), return_counts=True)), 
                 columns=['str_length', 'count'])
    Out[231]:
       str_length  count
    0           1      3
    1           2      1
    2           3      2
    
    

  • 답변 # 4

    또는 성능이 문제가 아닌 경우 다음을 사용할 수 있습니다

    df.id.groupby(lambda x: len(df.id[x])).size()
    
    

    또는

    df.id.groupby(df.id.apply(len)).size()
    
    

관련 자료

  • 이전 c# - HttpTrigger가 blob을 전달하도록 시도
  • 다음 Laravel 60에서 SweetAlert2를 설치할 수 없습니다