gpt4 book ai didi

python - 如何在 Python 中应用将多个数字拆分到数据框中的列字段的函数?

转载 作者:行者123 更新时间:2023-12-04 03:35:56 25 4
gpt4 key购买 nike

我需要应用一个函数来从数据帧的字段中拆分多个数字。

在此数据框中,有学校所需的所有 child 的测量值:姓名、高度、体重和唯一代码,以及他们的梦想职业。

  • 名称 仅由字母组成。但有些 child 可能既有名字又有中间名。 (例如 Vivien Ester)
  • 已知每个 child 的高度>= 100 厘米。
  • 已知每个 child 的体重 < 70 公斤。
  • 已知唯一 代码 可以是任何数字,但它与每个 child 的字母“AX”相关联。但 AX 可能并不总是与数字保持一致(例如 7771AX),它可能旁边有一个空格。 (例如 100 AX)
  • 每个 child 都有自己梦想的职业

它们可以任何顺序出现,但它们始终遵循上面的规则。但是,对于某些 child ,某些测量值不会出现(例如:高度或唯一代码或两者都缺失或全部缺失)。

所以数据框是这样的:

data = { 'Dream Career': ['Scientist', 'Astronaut', 'Software Engineer', 'Doctor', 'Fashion Designer', 'Teacher', 'Architect'],
'Measurements': ['Rachel 24.3 100.25 100 AX', '100.5 Tuuli 30.1', 'Michael 28.0 7771AX 113.75', 'Vivien Ester 40AX 115.20', 'Oliver 40.5', 'Julien 35.1 678 AX 111.1', 'Bee 20.0 100.80 88AX']
}

df = pd.DataFrame (data, columns = ['Dream Career','Measurements'])

它看起来像这样:

        Dream Career                Measurements
0 Scientist Rachel 24.3 100.25 100 AX
1 Astronaut 100.5 Tuuli 30.1
2 Software Engineer Michael 28.0 7771AX 113.75
3 Doctor Vivien Ester 40AX 115.20
4 Fashion Designer Oliver 40.5
5 Teacher Julien 35.1 678 AX 111.1
6 Architect Bee 20.0 100.80 88AX

我尝试根据指定的规则将所有这些度量拆分到不同的列中。

所以最终的数据框应该是这样的:

       Dream Career         Names  Weight  Height Unique Code
0 Scientist Rachael 24.3 100.25 100AX
1 Astronaut Tuuli 30.1 100.50 NaN
2 Software Engineer Michael 28.0 113.75 7771AX
3 Doctor Vivien Ester NaN 115.20 40AX
4 Fashion Designer Oliver 40.5 NaN NaN
5 Teacher Julien 35.1 111.10 678AX
6 Architect Bee 10.0 100.80 88AX

我试过这段代码,它工作得很好,但只适用于单个字符串。我需要在数据框中执行此操作,并且仍然保留每个 child 的同事梦想职业(这样订单就不会丢失)。

num_rx = r'[-+]?\.?\d+(?:,\d{3})*\.?\d*(?:[eE][-+]?\d+)?'
def get_weight_height(s):
nums = re.findall(num_rx, s)
height = np.nan
weight = np.nan
if (len(nums) == 0):
height = np.nan
weight = np.nan
elif (len(nums) == 1):
if float(nums[0]) >= 100:
height = nums[0]
weight = np.nan
else:
weight = nums[0]
height = np.nan
elif (len(nums) == 2):
if float(nums[0]) >= 100:
height = nums[0]
weight = nums[1]
else:
height = nums[1]
weight = nums[0]
return height, weight

class_code = {'Small': 'AX', 'Mid': 'BX', 'High': 'CX'}

def hasNumbers(inputString):
return any(char.isdigit() for char in inputString)

def extract_measurements(string, substring_name):
height = np.nan
weight = np.nan
unique_code = np.nan
name = ''
if hasNumbers(string):
num_rx = r'[-+]?\.?\d+(?:,\d{3})*\.?\d*(?:[eE][-+]?\d+)?'
nums = re.findall(num_rx, string)
if (substring_name in string):
special_match = re.search(rf'{num_rx}(?=\s*{substring_name}\b)', string)
if special_match:
unique_code = special_match.group()
string = string.replace(unique_code, '')
unique_code = unique_code + substring_name
if len(nums) >= 2 & len(nums) <= 3:
height, weight = get_weight_height(string)
else:
height, weight = get_weight_height(string)
name = " ".join(re.findall("[a-zA-Z]+", string))
name = name.replace(substring_name,'')
return format(float(height), '.2f'), float(weight), unique_code, name

我这样应用它:

string = 'Anya 101.30 23 4546AX'
height, weight, unique_code, name = extract_measurements(string, class_code['Small'])
print( 'name is: ', name, '\nh is: ', height, '\nw is: ', weight, '\nunique code is: ', unique_code)

结果非常好。

我尝试在数据帧上应用该函数,但我不知道如何操作,因为我从 this 得到启发而尝试了这个和 thisthis...但它们都与我的问题不同:

df['height'], df['weight'], df['unique_code'], df['name'] = extract_measurements(df['Measurements'], class_code['Small']) 

我不知道如何将它应用到我的数据框上。请帮助我。

我刚开始,如果你能帮助我,我非常感谢所有的帮助!

最佳答案

对行 (axis=1) 使用 apply 并选择“展开”选项。然后重命名列并连接到原来的df:

pd.concat([df,(df.apply(lambda row : extract_measurements(row['Measurements'], class_code['Small']), axis = 1, result_type='expand')
.rename(columns = {0:'height', 1:'weight', 2:'unique_code', 3:'name'})
)], axis = 1)

输出:

    Dream Career       Measurements                  height    weight  unique_code    name
-- ----------------- -------------------------- -------- -------- ------------- ------------
0 Scientist Rachel 24.3 100.25 100 AX 100 100 100AX Rachel
1 Astronaut 100.5 Tuuli 30.1 100 100 nan Tuuli
2 Software Engineer Michael 28.0 7771AX 113.75 100 100 7771AX Michael
3 Doctor Vivien Ester 40AX 115.20 100 100 40AX Vivien Ester
4 Fashion Designer Oliver 40.5 100 100 nan Oliver
5 Teacher Julien 35.1 678 AX 111.1 100 100 678AX Julien
6 Architect Bee 20.0 100.80 88AX 100 100 88AX Bee

(注意我 stub 了 def get_weight_height(string) 函数,因为你的代码没有包含它,总是返回 100,100)

关于python - 如何在 Python 中应用将多个数字拆分到数据框中的列字段的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66911980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com