В Python dataframe, как вы оставляете значения как пробелы, если None не выбран? - PullRequest
0 голосов
/ 11 марта 2019

Функция моего кода заключается в получении значений в пределах определенного допуска (допуск 100 ppm) от известных значений.

Данные, которые нужно собрать, выглядят следующим образом:

col1      col2
1000      10000
1050      20000
2000      30000

и т. Д. (До 400 строк).Ниже приведен фрагмент кода, который выбирается из списка раскладки (значения похожи на col1):

for files in file_list:
    df = pd.read_csv(files, engine='python')
    matches = pd.DataFrame(index=pickuplist['mass'],
                        columns=df.set_index(list(df.columns)).index,
                        dtype=bool)
    for index, exp_mass, intensity in df.itertuples():
        matches[exp_mass] = abs(matches.index - exp_mass)/matches.index < ppm/1e6
        if (len(matches[exp_mass])== 0):
            matches[exp_mass] = None
    results3 = matches.any().reset_index(name='a')[matches.any().values]

Структура каждого файла аналогична приведенной выше таблице примеров (col1, col2 и пустой столбец).).Список подбора выглядит следующим образом:

col1
1000.04
1050.02
2000.04

Текущий код при запуске выбирает нужные значения и выводит их как:

col1     col2
1000.04  10000
1050.02  20000
2000.04  30000

Однако я хочу оставить пробелы, если их нетвзял.Например, если в списке извлечения содержится значение в столбце col1, равное 1647,58, и в данных нет ничего, превышающего допуск 100 ppm, равный 1647,58, то соответствующий кадр данных для этого 1647,58 будет пустым:

col1     col2
1000.04  10000
1050.02  20000

2000.04  30000

if (len(matches[exp_mass])== 0):
    matches[exp_mass] = None

IЯ думал, что вышеприведенная часть поможет, но я ошибаюсь.Мы ценим любые предложения.Спасибо!

1 Ответ

1 голос
/ 11 марта 2019

Я думаю, что происходит то, что вы пытаетесь обновить переменную в python во время итерации.Это невозможно в Python, проверьте this для объяснения, но упрощенно представьте, что у вас есть этот код

import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[1000.04, 1000], [1050.02, 2000], [2000.04, 3000]]), columns=('col1', 'col2'))

for index, row in df.iterrows():
    if row['col1'] == 1000.04:
        row['col1'] == np.nan

print(df)

Вы можете подумать, что это изменит значение первой строки, однако если вывыполнить его, вы увидите, что этого не произойдет.Чтобы изменить ваш фрейм данных, вы должны изменить его следующим образом:

df.loc[df['col1'] == 1000.04, ['col1', 'col2']] = np.nan
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...