通过解析列值为dataframe创建新列,并使用另一列python中的值填充新列

2024-04-25 19:17:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

然后我有另一个列,其中的列表与第一个列相对应,但数据略有不同。如果值不在“不包括”列表中,我需要这些值来填充新列

下面是一个例子:

     Disease                             Status
0    Asthma|ARD                          Ph II|Ph I
1    Arthritis|Inflammation|Asthma       Ph III|Approved|No development reported

这应该变成:

^{pr2}$

在这里,“不包括”的列表将只是['没有发展'],但有更多的术语我想在这里包括。在

我正在处理的数据帧有很多列,我有兴趣开发一个函数,在这个函数中我可以简单地传递df、列名和一个“don not incude”列表,它将以有效的方式执行此任务(理想情况下没有任何或很少的循环)。在

我目前的方法是从Disease列创建一个集合,通过帕金森病然后在“疾病”列和“疾病”列中分别更正“疾病”和“疾病”两列。在

问题是我的数据帧大约有12k行,这变得异常耗时。在


Tags: 数据函数列表statusph例子iiiii
2条回答

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

df1 = pd.concat([df[col].str.split('|', expand=True).stack().reset_index(1, drop=True) for col in df.columns], axis=1)

df1的输出

^{pr2}$

然后你可以从这里开始,只选择你关心的列

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

然后将这个数据帧连接到原始数据帧

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
  • 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)

enter image description here

相关问题 更多 >