다음 데이터 프레임이 있습니다.
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_col
0.6667입니다 (0.25보다 큰 4 개의 숫자가 있고 6은이 목록의 길이입니다).
비교 열에 사용 DataFrame.squeeze
하고 인덱스 당 사용 :DataFrame.eval
mean
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] 삭제
몇 마디 만하겠습니다