【问题标题】:Compute new column based on keyword and split根据关键字计算新列并拆分
【发布时间】:2018-11-02 06:29:02
【问题描述】:

我有一个这样的数据框:

>>> df1
                         overall
0  class1-10/class2-11/class3-13
1  class3-31/class2-22/class1-23
2                abc/def/xyz/prq

如果在 'overall' 中找到 3 列 class1 、 class2 和 class3 ,我想计算它们。 所需的o/p

          overall                 class1  class2  class3
0  class1-10/class2-11/class3-13    10    11      13
1  class3-31/class2-22/class1-23    23    22      32
2                abc/def/xyz/prq     NaN  NaN     NaN

这如何以 pythonaic 方式完成? 谢谢

【问题讨论】:

  • 使用正则表达式组记录在here?
  • 我在这里尝试使用 str.extract 。

标签: python string pandas series


【解决方案1】:

使用str.extract 可能很诱人,但它只匹配文档中的第一个匹配项。另一方面,str.extractall 输出的数据帧有点过于复杂,无法使用。我们将求助于df.apply

import re

regex = re.compile(r'(class\d+)-(\d+)')

def func(x):
    data = regex.findall(x[0])
    for class_name, value in data:
        df.loc[x.name, class_name] = value

df.apply(func, axis=1)
print(df)

#                           overall class1 class2 class3
#  0  class1-10/class2-11/class3-13     10     11     13
#  1  class3-31/class2-22/class1-23     23     22     31
#  2                abc/def/xyz/prq    NaN    NaN    NaN

【讨论】:

  • 使用 .str.extract 会不会很容易?
  • @BharatSharma 没有。就像我提到的str.extract 在第一场比赛中停止
【解决方案2】:

没有正则表达式的一种方法是使用try / except

def splitter(x):
    try:
        return [int(i.split('-')[1]) for i in sorted(x.split('/'))]
    except IndexError:
        return [np.nan] * 3

df[['class1', 'class2', 'class3']] = df['overall'].apply(splitter).apply(pd.Series)

print(df)

                         overall  class1  class2  class3
0  class1-10/class2-11/class3-13    10.0    11.0    13.0
1  class3-31/class2-22/class1-23    23.0    22.0    31.0
2                abc/def/xyz/prq     NaN     NaN     NaN

【讨论】:

    【解决方案3】:

    使用 -

    def split_cols(x):
        for item in x['overall'].split('/'):
            if item.startswith('class'):
                pairs = item.split('-')
                x[pairs[0]] = pairs[1]
        return x
    df.apply(split_cols, axis=1)
    

    输出

        class1  class2  class3  overall
    0   10  11  13  class1-10/class2-11/class3-13
    1   23  22  31  class3-31/class2-22/class1-23
    2   NaN NaN NaN abc/def/xyz/prq
    

    说明

    split_cols() 函数负责创建额外的列。

    首先由/ 拆分,检查拆分中是否存在class

    然后它再次使用- 拆分,使用第一个拆分创建一个列,并将该列的值作为第二个拆分。

    然后整个事情通过apply函数完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2019-03-27
      • 1970-01-01
      相关资源
      最近更新 更多