Pandas에서 복잡한 용어를 계산하는 Python 방식 (목록의 길이로 나눈 숫자보다 크거나 같은 값)

키스

다음 데이터 프레임이 있습니다.

simple_list=[[3.0, [1.1, 2.2, 3.3, 4.4, 5.5]]]
simple_list.append([0.25, [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]])

df4=pd.DataFrame(simple_list,columns=['col1','col2'])

new_col다음 계산이있는 이라는 새 열을 만들고 싶습니다 .

col2에서 주어진 수보다 크거나 같은 요소의 발생 수를에서 col1목록의 길이로 나눈 값입니다 col2.

즉,

의 첫 번째 값 new_col은 다음과 같습니다. 0.6 (3.0보다 큰 숫자 3 개,이 목록의 길이 5 개)

두 번째 값은 new_col0.6667입니다 (0.25보다 큰 4 개의 숫자가 있고 6은이 목록의 길이입니다).

이스 르엘

비교 열에 사용 DataFrame.squeeze하고 인덱스 당 사용 :DataFrame.evalmean

df4['new'] = df4.explode('col2').eval('col1 < col2').mean(level=0)

이전에 DataFrame에 목록을 변환 mean하여 누락 된 값 생성 df1:

df1 = pd.DataFrame(df4['col2'].tolist(), index=df4.index)
df4['new'] = df1.gt(df4['col1'], axis=0).mask(df1.isna()).mean(axis=1)

느린 솔루션 :

또는 목록을 numpy 배열로 변환하여 목록 이해를 사용할 수 있습니다.

df4['new'] = [(np.array(b) > a).mean() for a, b in df4[['col1','col2']].to_numpy()]

다른 아이디어 DataFrame.apply:

df4['new'] = df4.apply(lambda x: (np.array(x['col2']) > x['col1']).mean(), axis=1)

print (df4)
   col1                            col2       new
0  3.00       [1.1, 2.2, 3.3, 4.4, 5.5]  0.600000
1  0.25  [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]  0.666667

성능 :

df4=pd.DataFrame(simple_list,columns=['col1','col2'])

df4 = pd.concat([df4] * 10000, ignore_index=True)


In [262]: %%timeit
     ...: df1 = pd.DataFrame(df4['col2'].tolist(), index=df4.index)
     ...: df4['new'] = df1.gt(df4['col1'], axis=0).mask(df1.isna()).mean(axis=1)
     ...: 
40.9 ms ± 3.03 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [263]: %timeit df4.explode('col2').eval('col1 < col2').mean(level=0)
97.2 ms ± 13.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [264]: %timeit [(np.array(b) > a).mean() for a, b in df4[['col1','col2']].to_numpy()]
305 ms ± 12 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [265]: %timeit df4.apply(lambda x: (np.array(x['col2']) > x['col1']).mean(), axis=1)
1.23 s ± 32.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관