簡體   English   中英

通過解析列值為數據框創建新列,並使用來自另一列python的值填充新列

[英]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
  • 將排除列表setset
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM