![](/img/trans.png)
[英]Python Pandas Dataframe: Using Values in Column to Create New Columns
[英]Create new columns for a dataframe by parsing column values and populate new columns with values from another column python
我需要基於特定列中的列表向數據框添加新列。 新列必須是從該列中所有列表派生的集合。
然后,我還有另一列帶有與第一列相對應的列表的列,但數據略有不同。 如果這些值不在“不包括”列表中,則需要這些值來填充新列
這是一個例子:
Disease Status
0 Asthma|ARD Ph II|Ph I
1 Arthritis|Inflammation|Asthma Ph III|Approved|No development reported
它應該變成:
Disease Status Asthma ARD Arthritis Inflammation
0 Asthma|ARD Ph II|Ph I Ph II Ph I
1 Arthritis|Inflammation|Asthma Ph III|Approved|No development Ph III Approved
這里的“不包括”列表只是['沒有開發'],但是我想在這里包括更多的術語。
我正在使用的數據框有很多列,我對開發一個函數很感興趣,在該函數中我可以簡單地傳遞df,列名和“請勿包含”列表,這些列表將以高效的方式執行此任務(理想情況下無需任何操作)或很少的循環)。
我當前的方法是從“疾病”列中創建一個集合,通過pd.concat將其添加到數據框中,然后遍歷每一行,在兩列中拆分值,然后遍歷“疾病”列表以放置正確的疾病列中的狀態。
問題是我的數據幀大約有12,000行,這非常耗時。
似乎您在每個單元格中都有多個值(來自先前和當前的問題)。 首先整理數據,然后繼續進行分析,要容易得多。 嘗試將每個值放在其自己的單元格的每一列中。
df1 = pd.concat([df[col].str.split('|', expand=True).stack().reset_index(1, drop=True) for col in df.columns], axis=1)
df1
輸出
0 1
0 Asthma Ph II
0 ARD Ph I
1 Arthritis Ph III
1 Inflammation Approved
1 Asthma No development reported
然后您可以從此處進行透視,並僅選擇您關心的列
cols = ['Asthma', 'ARD']
df2 = df1.reset_index().pivot(index='index',columns=0, values=1)[cols]
df2
輸出
0 Asthma ARD
index
0 Ph II Ph I
1 No development reported None
然后將這個DataFrame連接到原始
pd.concat((df, df2),axis=1)
Disease Status \
index
0 Asthma|ARD Ph II|Ph I
1 Arthritis|Inflammation|Asthma Ph III|Approved|No development reported
Asthma ARD
index
0 Ph II Ph I
1 No development reported None
set
一set
str.extractall
是一種樣式選擇。 str.split
會更快 query
以擺脫不包括在內的事物 join
dont_include = set(['No development'])
d1 = df.stack().str.extractall('([^|]+)')[0].unstack(1) \
.reset_index(1, drop=True).query('Status not in @dont_include') \
.set_index('Disease', append=1).Status.unstack().fillna('')
df.join(d1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.