Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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_Pandas - Fatal编程技术网

Python 如何将新变量更新到“详细信息”列中?

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

下面是放置在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','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