道歉凌亂標題:問題如下:使用Python,Pandas和Apply/Lambda,我該如何編寫一個創建多個新列的函數?
我有形式的一些數據幀:
df1 =
Entries
0 "A Level"
1 "GCSE"
2 "BSC"
我也有以下形式的數據幀:
df2 =
Secondary Undergrad
0 "A Level" "BSC"
1 "GCSE" "BA"
2 "AS Level" "MSc"
我有一個函數用於搜索df1中的每個條目,查找df2每列中的單詞。匹配的,保存的話(Words_Present):
def word_search(df,group,words):
Yes, No = 0,0
Words_Present = []
for i in words:
match_object = re.search(i,df)
if match_object:
Words_Present.append(i)
Yes = 1
else:
No = 0
if Yes == 1:
Attribute = 1
return Attribute
我應用此功能在在DF1所有條目,並在DF2所有列,使用下面的迭代:
for i in df2:
terms = df2[i].values.tolist()
df1[i] = df1['course'][0:1].apply(lambda x: word_search(x,i,terms))
這就產生一個輸出DF它看起來像:
df1 =
Entries Secondary undergrad
0 "A Level" 1 0
1 "GCSE" 1 0
2 "AS Level" 1 0
我想修改Word_Search功能所涉及的Words_Present列表輸出以及屬性,並輸入到這些新列,所以是m Ÿ最終DF1陣列的樣子:
期望中的數據框:
Entries Secondary Words Found undergrad Words Found
0 "A Level" 1 "A Level" 0
1 "GCSE" 1 "GCSE" 0
2 "AS Level" 1 "AS Level" 0
如果我做的:
def word_search(df,group,words):
Yes, No = 0,0
Words_Present = []
for i in words:
match_object = re.search(i,df)
if match_object:
Words_Present.append(i)
Yes = 1
else:
No = 0
if Yes == 1:
Attribute = 1
if Yes == 0:
Attribute = 0
return Attribute,Words_Present
我的功能,因此現在有多個輸出。因此,應用以下:
for i in df2:
terms = df2[i].values.tolist()
df1[i] = df1['course'][0:1].apply(lambda x: word_search(x,i,terms))
我的輸出如下:
Entries Secondary undergrad
0 "A Level" [1,"A Level"] 0
1 "GCSE" [1, "GCSE"] 0
2 "AS Level" [1, "AS Level"] 0
pd.apply()的輸出始終是一個熊貓系列,所以它只是猛推到一切DF的單細胞[我]其中我=次要的。
是否可以將.apply的輸出分成兩個單獨的列,如所需的數據框所示?
我諮詢了很多問題,但似乎都不直接產生多列時,包含在應用語句中的函數來處理具有多種輸出:
Applying function with multiple arguments to create a new pandas column
Create multiple columns in Pandas Dataframe from one function
Apply pandas function to column to create multiple new columns?
例如,我也嘗試過:
for i in df2:
terms = df2[i].values.tolist()
[df1[i],df1[i]+"Present"] = pd.concat([df1['course'][0:1].apply(lambda x: word_search(x,i,terms))])
但這只是產生錯誤,如:
raise ValueError('Length of values does not match length of ' 'index')
有沒有辦法使用應用的方式,但仍然直接提取的額外信息爲多列?
非常感謝,歉意的長度。
我已經回答了你的問題,但是我想對'df1 ['course'] [0:1]''這樣的表達做一個側面評論':這被稱爲鏈接索引,這在熊貓中應該避免,因爲它很慢,並且當您想要更改數據框中的元素時常常會導致問題。相反,'df1.loc [0:1,'course']'是引用同一事物的正確方法。 –
(另外,如果沒有找到匹配的單詞,你的'word_search()'函數會返回一個錯誤,因爲'Attribute'除非'Yes == 1!'纔會被分配!) –
你的第一點:謝謝,我不知道,並且正在根據我繼承的文件編寫此代碼。 您的第二點:我在複製我的代碼時犯了一個錯誤:我打算在if語句的兩個部分中包含這兩個代碼。我急於想到這一點,我錯過了它。 謝謝你指出。 [兩者現在都更新] – Chuck