python - pandas 将字符串评估为数字

标签 python pandas eval

假设 df 为;

data = {'duration':['1week 3day 2hour 4min 23', '2hour 4min 23sec', '2hour 4min', np.nan, '', '23sec']}
df = pd.DataFrame(data)

我正在尝试将持续时间计算为秒数总和。将值替换为:

df['duration'] = df['duration'].str.replace('week', '*604800+') \
                                                                 .str.replace('day', '*604800+') \
                                                                 .str.replace('hour', '*3600+') \
                                                                 .str.replace('min', '*60+') \
                                                                 .str.replace('sec', '')  \
                                                                 .str.replace(' ', '')

但无法运行 eval 函数,例如(pd.eval、apply.eval、eval 等)。某些单元格以“+”号结尾或其他字符串/不存在问题..有帮助吗?

Ps:这不是一个重复的问题。

最佳答案

您可以使用正则表达式与自定义函数相结合,将周替换为 7 天,并在单独的数字上添加秒(您可以添加其他单位)。然后转换to_timedelta :

def change_units(m):
    d = {'week': (7, 'days'), '': (1, 's')}
    _, i, period = m.groups()
    factor, txt = d[period]
    return f'{factor*int(i)}{txt}'
    
df['delta'] = pd.to_timedelta(df['duration'].str.replace(r'((\d)\s*(week|)\b)',
                                                         replace, regex=True))

输出:

                   duration            delta
0  1week 3day 2hour 4min 23 10 days 02:04:23
1          2hour 4min 23sec  0 days 02:04:23
2                2hour 4min  0 days 02:04:00
3                       NaN              NaT
4                                        NaT
5                     23sec  0 days 00:00:23

然后您可以从 TimeDelta 对象中受益,例如转换为 total_seconds :

pd.to_timedelta(df['duration'].str.replace(r'((\d)\s*(week|)\b)',
                                           change_units, regex=True)
               ).dt.total_seconds()

输出:

0    871463.0
1      7463.0
2      7440.0
3         NaN
4         NaN
5        23.0
Name: duration, dtype: float64

关于python - pandas 将字符串评估为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72259405/

相关文章:

python - Pandas 中不同列的不同填充方法

python - Google Colab - 无法打开任何笔记本

python - 如何在机器人框架库文件中进行多重继承?

python - Pandas to_sql 索引从 1 开始

javascript - 使用 "eval"创建匿名方法 - 浏览器特定行为

python: ValueError: 加载字典结构时字符串格式错误

javascript - 如何使用单独变量(对象)中指定的参数调用函数?

python - 将 pytz 导入 AWS lambda 函数

python - 如何(快速)从二维图像的特定点提取双线性插值补丁?

python - 随着时间的推移更新 pandas 的胜率