由重叠的低部分和高部分组成的组合数

2024-05-17 17:11:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大约6-7位感兴趣的测量数据,但是由于它是在一个“粗糙”的环境中记录的,所以数据记录器非常原始(但很健壮),只能记录4位数字。因此,我将我的测量数据分为低部分和高部分,根据测量的数量,最多三位数字可能重叠,低部分的值优先。你知道吗

例如,测量能量流(单位:kW):

P_real = 34.648  # actual value
P_low = 4.648  # low part
P_high = 34.6  # high part

所以在这种情况下,为了得到“真实的”能量流,我需要以某种方式组合这些数字。因为我有一个相当大的熊猫数据帧,其形状超过(1000000, 150),所以必须避免转换为字符串并在正确的位置进行切片。你知道吗

此外,数据中还包括NaN。这阻碍了整数转换,因此在“组合”部件之前还需要掩蔽。你知道吗

一些示例数据:

ser_hi = pd.Series([34.4, np.nan, np.nan, 35.4, 36.5])
ser_lo = pd.Series([4.648, np.nan, 4.698, 5.498, 6.498])

当前“变通”程序的预期输出:

mask_nan = ~(ser_hi.isna() | ser_lo.isna())  # mask for non-nan-values
ser_real = pd.Series(index=ser_hi.index)  # create series for masking the result
# workaround calculation with masking to avoid nan-conversion error
ser_real[mask_nan] = (ser_hi[mask_nan] / 10).astype(int) * 10 + ser_lo[mask_nan]
print(ser_real)
# Out: 0    34.648
       1    NaN
       2    NaN
       3    35.498
       4    36.498
       dtype: float64

有没有办法“简化”这种组合,只需“删除”指定位数之前/之后的数字?例如,我将两个字符串组合如下:

str_hi = '34.4'
str_lo = '4.648'
str_real = str_hi[:1] + str_lo

当然,对于float来说,字符串的性能非常糟糕。(即使性能还可以,我也不喜欢将数字数据转换成字符串再转换回数字数据。;))

提前谢谢你的建议!你知道吗


Tags: 数据字符串lonp记录mask数字nan
2条回答

如果选择在小数点处剪切信号,可以执行以下操作:

df = pd.DataFrame({'high':[34.4, np.nan, np.nan, 35.4, 36.5],
                   'low': [4.648, np.nan, 4.698, 5.498, 6.498]})

# flag the NaN signals
flags = ~df.isna().any(axis=1)

df[flags].high.map(int) + df[flags].low - df[flags].low.map(int)

输出:

0    34.648
3    35.498
4    36.498
dtype: float64

不确定它是否回答了您的问题,但是使用np.trunc而不是astype(int)应该可以解决NaN数据的问题

np.trunc(ser_hi / 10) * 10 + ser_lo 

0    34.648
1       NaN
2       NaN
3    35.498
4    36.498
dtype: float64

相关问题 更多 >