Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于关键字和拆分计算新列_Python_String_Pandas_Series - Fatal编程技术网

Python 基于关键字和拆分计算新列

Python 基于关键字和拆分计算新列,python,string,pandas,series,Python,String,Pandas,Series,我有这样一个数据帧: >>> df1 overall 0 class1-10/class2-11/class3-13 1 class3-31/class2-22/class1-23 2 abc/def/xyz/prq 我想计算3列class1、class2和class3,如果它们位于“总体”中。 所需o/p overall class1 c

我有这样一个数据帧:

>>> df1
                         overall
0  class1-10/class2-11/class3-13
1  class3-31/class2-22/class1-23
2                abc/def/xyz/prq
我想计算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的方式实现这一点? 谢谢

使用-

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\u cols()
函数负责创建额外的列

它首先按
/
进行拆分,检查拆分中是否存在

然后它用
-
再次拆分,生成一列,第一次拆分该列的值作为第二次拆分


然后,整个过程通过
apply
功能进行

可能会尝试使用
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

没有正则表达式的一种方法是使用
try
/
,但
除外:

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

对于记录的正则表达式组?我尝试在这里使用str.extract。使用.str.extract会不会很容易?@BharatSharma No.就像我提到的
str.extract
在第一次匹配时停止