Pandas 列的特征到多个列

Pandas column of features to multiple columns

提问人:Nader Shehata 提问时间:9/24/2022 最后编辑:RabinzelNader Shehata 更新时间:9/24/2022 访问量:129

问:

我有一个有 9 列的 CSV 文件,最后一个是功能列表的一列,如下所示:

  First Name  Last Name                         Email Grad Date                Major List  Appointments Count  Advising Time  Labels Count                                   Labels Name List
0     Adrien      Yanez           [email protected]       NaN  Psychology: Neuroscience                  12            325            18  acad_stat=gr, class_code=sr, sess=fa, re_id=11...
1    Aindrea     Braams             [email protected]       NaN  Psychology: Neuroscience                   4            120            17  cx_id=600852, re_id=1114446, primary_departmen...
2      Alida  Swinburne  [email protected]  5/1/2022                Psychology                   1             30            14  re_id=1124407, primary_department=psychology, ...

该列是目标列,目标是创建新列,每个列都有一个列表中的标签或要素的名称,值是列表中标签名称后面的“=”符号后面的值,如果没有“=”符号,则取值 1。Labels Name List

例如,如果第 1 行的标记列表为:
adv1=syed ahmad, cx_id=616758, re_id=1112539, slate_id=, class_session=spring, class_yr=2018, advd=joseph atkins, adv2=, not labeled seniors 2022

输出将如下所示:

         adv1   cx_id    re_id  slate_id class_session  class_yr           advd  adv2  not labeled seniors 2022
0  syed admad  616758  1112539         1        spring      2018  joseph atkins     1                         1

那么我该如何在熊猫身上做到这一点呢?
注意:对于所有行,总列数当然是固定的,这意味着如果一行没有标签名称,它将在此标签列中取值 none 或 0

Python Pandas DataFrame 多列

评论

0赞 Rabinzel 9/24/2022
请更多地关注目标列,并提供完整的示例数据,但未向其提供所需的输出。...
0赞 Nader Shehata 9/24/2022
首先感谢您编辑问题并设置其格式,但很抱歉我无法理解您专注于目标列的观点
0赞 Rabinzel 9/24/2022
还行。好吧,也许可以在这里快速浏览一下如何提供 MRE。我的意思是,对于您的问题,我们不需要输入 csv 文件中的所有其他列(您的问题仅涉及),但要解释您的问题,您需要提供此列中数据的完整示例。然后,为该特定示例提供所需的输出,就像对第 1 行所做的那样Labels List Name

答:

0赞 AndrzejO 9/24/2022 #1

您可以创建一个函数,该函数将接收一个labels_name_list,将其除以,然后按 by 进行拆分以获得键值对,并将它们作为 .像这样:,=dict

def fun(label_names_list):
    key_val_strings = label_names_list.split(',')
    key_val = map(lambda z: (z[0], z[1]), [x.split('=') for x in key_val_strings])
    return dict(key_val)

然后,您需要将其应用于labels_name_list列。这将创建一个新的数据帧:

new_df = df[1].apply(lambda s: pd.Series(fun(s)))

例如

a = [['A', 'Z=cat,b=a1, c=a2'], ['B', 'Z=dog,c=b1,  d=b2']]
new_df = df[1].apply(lambda s: pd.Series(fun(s)))

new_df:

    Z    b   c    c   d
0   cat a1  a2  NaN NaN
1   dog NaN NaN b1  b2

这不是一个完整的解决方案,例如它不会删除空格,所以你这里有两列“c”和“c”,因为之前spacec