Объединить число, состоящее из перекрывающихся нижней части и верхней части - PullRequest
4 голосов
/ 11 апреля 2019

У меня есть данные измерений с примерно 6-7 интересующими цифрами, но, поскольку они регистрируются в «грубой» среде, регистратор данных довольно примитивен (но надежен) и может регистрировать только 4 цифры.Таким образом, я разделяю свои данные измерений на нижнюю и верхнюю части, где в зависимости от измеренной величины могут перекрываться до трех цифр, причем значения нижней части имеют приоритет.

Например, измерение энергиипоток в кВт:

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

Так что в этом случае, чтобы получить «реальный» поток энергии, мне нужно как-то объединить цифры.Поскольку у меня есть довольно большой пандан DataFrame с формой больше (1000000, 150), необходимо избегать преобразования в строки и нарезки в правильных положениях.

Кроме того, NaN s включены в данные.Это затрудняет целочисленное преобразование и, таким образом, дополнительно требует маскировки перед «объединением» частей.

Некоторые примеры данных:

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

Но, конечно, для чисел с плавающей запятой, поскольку производительность со строками ужасна.(И даже если производительность была в порядке, я просто не люблю преобразовывать числовые данные в строки и обратно в числовые.;))

Спасибо за ваш совет заранее!

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Не совсем уверен, что он отвечает на ваш вопрос, но использование np.trunc вместо astype(int) должно обойти проблему с NaN data

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

0    34.648
1       NaN
2       NaN
3    35.498
4    36.498
dtype: float64
1 голос
/ 11 апреля 2019

если вы решили обрезать сигналы в десятичных точках, вы можете сделать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...