为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas - 通过计算不规则字符串模式创建新列

Pandas - 通过计算不规则字符串模式创建新列

波斯汪 2022-05-24 09:27:00
我在熊猫数据框中有一些数据,如下所示:|           Data           | ----------------------------    |   10-9   8-6    100-2    |----------------------------|           1-2    3-4     |----------------------------|                  55-45   |----------------------------现在我的问题是,使用熊猫,执行以下操作的最佳方法是什么:计算连字符之前的第一个数字的平均值,以及连字符之后的数字的平均值。从第一个中减去第二个,然后放入一个新列。例如,对于第一行,新列中的值将是:average(10, 8, 100) - average(9, 6, 2)我猜我需要使用某种 lambda 函数,但我不确定如何去做。任何帮助表示赞赏。谢谢!
查看完整描述

2 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

制作一个包含字符串解析逻辑的函数:


import pandas as pd

import numpy as np


def string_handling(string):

    values = [it for it in string.strip().split(' ') if it]

    values = [v.split('-') for v in values]

    first_values = [int(v[0]) for v in values]

    second_values = [int(v[1]) for v in values]

    return pd.Series([np.mean(first_values), np.mean(second_values)])

应用功能:


df[['first_value','second_value']] = df['Data'].apply(string_handling)

df['diff'] = df['first_value'] - df['second_value']


查看完整回答
反对 回复 2022-05-24
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

这可能会奏效。split()将摆脱所有的空白。还使用列表推导来遍历由split()(例如['10-9', '8-6', '100-2'])创建的所有标记。


In [37]: df = DataFrame({'Data': ["   10-9   8-6    100-2    ",

                         "           1-2    3-4     ", 

                         "                  55-45   "]})


In [38]: def process(cell):

    ...:     avg = []

    ...:     for i in range(2):

    ...:         l = [int(x.split("-")[i]) for x in cell.split()]

    ...:         avg.append(sum(l) * 1. / len(l))

    ...:     return avg[0] - avg[1]

    ...:


In [39]: df['Data'].apply(process)

Out[39]:

0    33.666667

1    -1.000000

2    10.000000

Name: Data, dtype: float64

希望这可以帮助!


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信