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
在第一次匹配时停止