通过解析列值并使用来自另一列python的值填充新列来为数据框创建新列

时间:2017-01-11 00:21:19

标签: python performance pandas

我需要根据特定列中的列表向数据框添加新列。新列需要是从列中的所有列表派生的集合。

然后我有另一列,列表对应第一列,但数据略有不同。如果值不在"不包括"我需要这些值来填充新列。列表

以下是一个例子:

     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将其添加到数据框,然后遍历每一行,拆分两列中的值,然后循环遍历"疾病& #34;列表以在疾病列中输入正确的状态。

这个问题是我的数据帧大约是12k行,这变得非常耗费时间。

2 个答案:

答案 0 :(得分:2)

您似乎在每个单独的单元格中都有多个值(来自您之前和当前的问题)。首先整理数据然后继续进行分析会容易得多。尝试将每列中的每个值放在自己的单元格中。

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

答案 1 :(得分:1)

  • 将排除列表设为set
  • str.extractall是一种风格选择。 <{1}}会更快
  • str.split摆脱不包含的内容
  • query
join

enter image description here