Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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 如何在数据帧切片中使用apply来设置多列的值_Python_Pandas_Dataframe_Apply - Fatal编程技术网

Python 如何在数据帧切片中使用apply来设置多列的值

Python 如何在数据帧切片中使用apply来设置多列的值,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,我正试图使用apply函数通过.loc查询将新值分配给数据帧切片中的两个现有列 要复制-首先创建数据帧: import re import panads as pd data = [[1000, "MSL", "Test string"], [2000, 'AGL', 'other string'], [0, 'AGL', "xxxx SFC-10000ft MSLXXX"]] df = pd.DataFrame(data=data,

我正试图使用apply函数通过.loc查询将新值分配给数据帧切片中的两个现有列

要复制-首先创建数据帧:

import re
import panads as pd
data = [[1000, "MSL", "Test string"], [2000, 'AGL', 'other string'], [0, 'AGL', "xxxx SFC-10000ft MSLXXX"]]
df = pd.DataFrame(data=data, columns=['Alt', "AltType",'FreeText'])
然后创建apply函数

def testapply(row):
    try:
        match = re.findall("SFC-([0-9]+)FT (MSL|AGL|FL)", row.FreeText)[0]
        return (int(match[0]), match[1])
    except:
        return (0, row.AltType)
当我跑的时候

df.loc[df['Alt']==0, ['Alt', 'AltType']] = df.loc[df['Alt']==0].apply(testapply, axis=1)
我想得到的结果是:

     Alt AltType                 FreeText
0   1000     MSL              Test string
1   2000     AGL             other string
2  10000     MSL  xxxx SFC-10000ft MSLXXX
但我最终得到的是:

            Alt       AltType                 FreeText
0          1000           MSL              Test string
1          2000           AGL             other string
2  (10000, MSL)  (10000, MSL)  xxxx SFC-10000FT MSLXXX
有人知道如何一下子完成这项工作吗?

只需添加
tolist()


让我们尝试
Series.str.extract
并使用布尔索引和
loc
替换列
Alt
AltType
中的值,其中列
Alt
包含
0

m = df['Alt'].eq(0)
df.loc[m, ['Alt', 'AltType']] = df.loc[m, 'FreeText'].str.extract(r'(?i)SFC-(\d+)FT\s(MSL|AGL|FL)').values


仅将testapply函数更改为:

def testapply(row):
    try:
        match = re.findall("SFC-([0-9]+)ft (MSL|AGL|FL)", row.FreeText)[0]
        print(match)
        return (int(match[0]), match[1]).tolist()
    except:
        return (0, row.AltType)

使用loc访问器选择相关的
Alt
列。使用
regex

df.loc[df['Alt']==0,'Alt']=df.loc[df['Alt']==0,'FreeText'].str.extract('(\d+)')[0]



     Alt AltType                 FreeText
0   1000     MSL              Test string
1   2000     AGL             other string
2  10000     AGL  xxxx SFC-10000ft MSLXXX

我在回答中解释说,您需要返回列表而不是元组。通过在函数中的返回(int(match[0]),match[1])末尾添加一个tolist()可以解决这个问题。将tolist链接到apply函数对我有效,而不是转换apply函数中的返回值。正如@mhDG7所指定的。这在技术上是可行的,但在更复杂的工作流的更一般情况下除外。为了这个线程,我简化了我的实际代码。这在技术上是可行的,除非在更复杂的工作流的更一般的情况下。为了这个线程,我简化了我的实际代码。
def testapply(row):
    try:
        match = re.findall("SFC-([0-9]+)ft (MSL|AGL|FL)", row.FreeText)[0]
        print(match)
        return (int(match[0]), match[1]).tolist()
    except:
        return (0, row.AltType)
df.loc[df['Alt']==0,'Alt']=df.loc[df['Alt']==0,'FreeText'].str.extract('(\d+)')[0]



     Alt AltType                 FreeText
0   1000     MSL              Test string
1   2000     AGL             other string
2  10000     AGL  xxxx SFC-10000ft MSLXXX