Как искать строки, чтобы проверить, содержит ли строка значение, и извлечь только этот конкретный столбец - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь перебрать строки в кадре данных, чтобы найти значение TRUE.Кадр данных выглядит следующим образом:

Mass    900.5    901.5    902.5    1000.5    1001.5   
Height  100      200      300      400       500
mass
901.4  FALSE     TRUE     FALSE    FALSE     FALSE
903.5  FALSE     FALSE    FALSE    FALSE     FALSE
1001.4 FALSE     FALSE    FALSE    FALSE     TRUE

Как видите, строка может иметь значение «ИСТИНА» или может иметь только «ЛОЖЬ».Я хочу перебрать строки для 1-го столбца после массы, и искать, если строка не имеет «ИСТИНА».Если строка не имеет «ИСТИНА», то я хочу присвоить значение для этой конкретной строки как пустое пространство (эквивалентно None в Python, я считаю).Мой текущий код извлекает значения «ИСТИНА» и собирает соответствующие значения высоты.

Например, приведенный выше кадр данных после использования моего кода даст:

текущие результаты:

Mass    Height
901.4   200
1001.4  500

код 1:

matches = pd.DataFrame(index=pickuplist['mass'],
                        columns=df.set_index(list(df.columns)).index,
                        dtype=bool)

ПростоК вашему сведению, код 1 - это то место, где изначально определено соответствие df.

код 2:

for index, exp_mass, intensity in df.itertuples():
    matches[exp_mass] = abs(matches.index - exp_mass)/matches.index < ppm/1e6

Приведенная выше строка - это то, что создает примерный информационный кадр после получения значений на основе допусков ppm.

код 3:

list = matches.any().reset_index(name='a')[matches.any().values]

Приведенная выше строка - это то, что, как я считаю, извлекает значения массы и высоты (таблица текущих результатов).

Я пытался использовать if / iloc и другие, чтобы увидетьесли бы я мог назначить None для конкретной строки, но не работал.Ожидаемые результаты должны быть:

список:

Mass    Height
901.4   200
903.5   
1001.4  500

(Edit1) Я попытался использовать предложения первого ответа, и он дал мне как:

    Height
0   TRUE
1   TRUE
2   TRUE

Может быть, форматы датафреймов разные.Также нет значений False или NaN.Обратите внимание, что между строкой высоты и строкой 901,4 есть пустая строка.

(Edit2) Попытка с использованием предложений из второго ответа, и он дал мне:

    Mass    Height
0   901.4   (901.4, 200)
1   903.5   (903.5, 518)
2   1001.4  (1001.4, 500)

Значение высоты строки индекса 1 должно быть пустым, но для некоторых получено случайное значениепричина.Если посмотреть на импортированные данные, которые входят в соответствующий кадр данных, то значение 518 представляется первым значением высоты данных.

Исходные данные, поступающие в фрейм данных, выглядят следующим образом:

Mass    Height
899.1   518
900.5   100
901.5   200
902.5   300
950.5   400
1000.5  400
1001.5  500

и т. Д.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Если нужно первое True значение, если оно существует, иначе NaN сначала удалите первый уровень MultiIndex на DataFrame.droplevel, затем добавьте новый столбец с именем NaN для строк совпадения с * Только 1008 * и последнее использование DataFrame.idxmax для столбца первого True в строках:

df1 = df.droplevel(0, axis=1)
df1[np.nan] = True
df2 = df1.idxmax(axis=1).rename_axis('Mass').reset_index(name='Height')
print (df2)
     Mass Height
0   901.4    200
1   903.5    NaN
2  1001.4    500
0 голосов
/ 03 апреля 2019

Вы можете сделать что-то вроде следующего, это не совсем чистый способ, но он будет работать для вас.

Я создаю df как ваш результат:

    import pandas as pd
    df = pd.DataFrame(index = [901.4, 903.5, 1001.4],
                      columns=[100, 200, 300, 400, 500],
                      data=[[False, True, False, False, False],
                            [False, False, False, False, False],
                            [False, False, False, False, True]])
   df.index.name = 'mass'
   df.columns.name = 'Height'

Здесь я будупропустите все строки и создайте новый df в правильном формате:

    import numpy as np

    new_df = pd.DataFrame(columns = ['Height'])
    for index, row in df.iterrows():
        if not row.any():
            new_df.loc[index, 'Height'] = np.nan
        else:
            new_df.loc[index, 'Height'] = row.any()

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...