"a"및 "b"열이있는 pandas Dataframe이 있습니다. 열 a에는 열 값으로 값 목록이 있고 열 "b"에는 열 "a"에 나타날 수있는 단일 값이있는 목록이 있습니다. apply를 사용하여 a 열 값에 나타나는 b의 요소 위치 값이있는 열 a 및 b를 기반으로 새 열 c를 만들고 싶습니다. (c : (a에서 b의 인덱스) +1) 열 b는 항상 하나의 요소가 있거나 전혀 요소가없는 목록이고, 열 a는 길이에 관계없이 가능하지만 비어있는 경우 b 열도 비어 있습니다. 열 b 요소는 열 a에있을 것으로 예상되며 열 a에서 첫 번째 항목의 위치를 찾고 싶습니다.
a b c
['1', '2', '5'] ['2'] 2
['2','3','4'] ['4'] 3
['2','3','4'] [] 0
[] [] 0
...
잘 작동하는 for 루프를 작성했지만 꽤 느립니다.
for i in range(0,len(df)):
if len(df['a'][i])!=0:
df['c'][i]=df['a'][i].index(*df['b'][i])+1
else:
df['c'][i]=0
하지만 더 빨리 적용하기 위해 사용하고 싶습니다. 다음은 작동하지 않습니다. 어떤 생각이나 제안을 주시면 대단히 감사하겠습니다.
df['c']=df['a'].apply(df['a'].index(*df['b']))
먼저 .NET을 사용하는 기본 방법 .apply()
입니다.
import pandas as pd
import numpy as np
list_a = [['1', '2', '5'], ['2', '3', '4'], ['2', '3', '4'], []]
list_b = [['2'], ['4'], [], []]
df_1 = pd.DataFrame(data=zip(list_a, list_b), columns=['a', 'b'])
df_1['a'] = df_1['a'].map(lambda x: x if x else np.NaN)
df_1['b'] = df_1['b'].map(lambda x: x[0] if x else np.NaN)
#df_1['b'] = df_1['b'].map(lambda x: next(iter(x), np.NaN))
def calc_c(curr_row: pd.Series) -> int:
if curr_row['a'] is np.NaN or curr_row['b'] is np.NaN:
return 0
else:
return curr_row['a'].index(curr_row['b'])
df_1['c'] = df_1[['a', 'b']].apply(func=calc_c, axis=1)
df_1
결과:
a b c
-- --------------- --- ---
0 ['1', '2', '5'] 2 1
1 ['2', '3', '4'] 4 2
2 ['2', '3', '4'] nan 0
3 nan nan 0
빈 목록을로 대체 NaN
했는데 훨씬 더 관용적이고 실용적입니다.
이것은 분명히 이상적인 해결책이 아니며 다른 것을 찾으려고 노력할 것입니다. 분명히 귀하의 프로그램과 DataFrame에 대한 정보가 많을수록 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다