Python 如何将新变量更新到“详细信息”列中?
下面是放置在AF列中的新计算变量。但是,旧的AF变量是错误的,它仍在“详细信息”列中。如图中所示,在0行中,我们看到“AF=u”,但在列AF中,我们发现“AF=0.3”。因此,我们需要将新的AF变量更正为旧的AF变量。在第2行,我们在detail列中看到,AF为3,但我们需要按照AF列所示进行更正,即值为0.7 数据帧是这样的Python 如何将新变量更新到“详细信息”列中?,python,pandas,Python,Pandas,下面是放置在AF列中的新计算变量。但是,旧的AF变量是错误的,它仍在“详细信息”列中。如图中所示,在0行中,我们看到“AF=u”,但在列AF中,我们发现“AF=0.3”。因此,我们需要将新的AF变量更正为旧的AF变量。在第2行,我们在detail列中看到,AF为3,但我们需要按照AF列所示进行更正,即值为0.7 数据帧是这样的 df = pd.DataFrame([ ['A','B','C','z;AC;AD;W;AF=u;Q;R','0.3','G'], ['h
df = pd.DataFrame([
['A','B','C','z;AC;AD;W;AF=u;Q;R','0.3','G'],
['h','k','J','k;5;E;AF=0.6;AG=y;Q;R','0.6','M'],
['O','P','Q','k;e;AF=3;W;y;Q;R','0.7','T'],
['U','V','W','a;b;AF=0.9;y;Q;R','0.65','Z'],
['U','V','W','a;b;AF=0.8;y;Q;R','1','Z']
], columns=['Col1','Col2','Col3','detail','AF','Col4'])
我们得到下图
新的列更新很容易,但由于列中混合了一些字符,而不仅仅是一个纯值,因此变得复杂
预期结果如下图所示
那么,如何获得如下图所示的结果呢?一旦您有了数据帧,对于Column'detail'中的字符串值,您可以使用下面的简单例程进行修改-我不包括pandas函数,因为这应该是直截了当的
>s='c;DSD;DF;AF=0.3;QW'
>>>l=s.split(“;”)
>>>修改的_list=list(映射(lambda x:AF=0.5,如果x.startswith('AF='),否则x,l))
>>>打印(修改的列表)
['c','D','SD','DF','AF=0.5','Q','W']
>>>打印(“;”.join(修改的_列表))
CDSD;DF;AF=0.5;QW
在上面的示例中,我硬连线了“AF=0.5”-您可以使用AF列值创建该字符串。我就是这样做的,在
AF=
上拆分,并在下一个之前的文本上添加一个
字符代码>
pat = r"AF=[^;]*"
repl = "AF=|"
df['temp'] = df['detail'].str.replace(pat,repl)
df['detail'] = df['temp'].str.split('|').str[0].astype(str) + df['AF'].astype(str) + df['temp'].str.split('|').str[1].astype(str)
df = df.drop(columns=['temp'])
给予
唯一的缺点是细节不应该包含|
字符。为了更安全,你可以使用一些疯狂的unicode字符。还要确保没有另一列“temp”。我觉得在您的用例中进行的转换可能比您在示例中提到的要多,因此我将从一般方法开始。下面是我使用regex replace和.apply()
的解决方案
这种方法非常通用,可以容纳任何逻辑。但是,对于纯字符串操作,我更喜欢pandas
默认提供的向量化方法。这些都很快
df['detail'] = df.detail.str.split('AF=').str[0] + 'AF=' \ # The part till 'AF='
+ df['AF'] +';' \ # The correct value
+ df.detail.str.split('AF=').str[1].str.split(';').str[1:].str.join(';') # The last bit
嗨,保罗,它将在AF=0.6;时离开;。6和似乎有一些字符剩余。啊,错过了*
之后的任何东西,但代码>正则表达式。修好了是的!这起作用了。谢谢,很高兴知道。你应该考虑接受这个答案。
import re
def myfunc(x, str_pattern):
return re.sub(str_pattern, f"AF={x['AF']};", x['detail'])
af_pattern = re.compile(r"AF=.+?;") # Pattern to replace
df['detail'] = df.apply(myfunc, axis=1, str_pattern=af_pattern) # Reassign the 'detail' column
df['detail'] = df.detail.str.split('AF=').str[0] + 'AF=' \ # The part till 'AF='
+ df['AF'] +';' \ # The correct value
+ df.detail.str.split('AF=').str[1].str.split(';').str[1:].str.join(';') # The last bit