我有大约6-7位感兴趣的测量数据,但是由于它是在“恶劣”环境中记录的,因此数据记录器相当原始(但功能强大),只能记录4位数字。因此,我将测量数据分为低部分和高部分,根据所测量的数量,最高三位数可能会重叠,低部分的值优先。
例如测量以kW为单位的能量流:
P_real = 34.648 # actual value
P_low = 4.648 # low part
P_high = 34.6 # high part
因此,在这种情况下,为了获得“实际”能量流,我需要以某种方式组合数字。由于我有一个很大的pandas DataFrame,其形状大于(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
但是对于浮点数来说当然是这样,因为字符串的性能很糟糕。 (即使性能还可以,我只是不喜欢将数字数据转换为字符串然后再转换为数字数据。;))
谢谢您的建议!
答案 0 :(得分:1)
如果选择剪切小数点处的信号,则可以执行以下操作:
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
答案 1 :(得分:1)
不确定是否能回答您的问题,但是使用np.trunc
数据代替astype(int)
可以解决此问题
NaN