Найти момент времени в столбце, читая максимум в другом столбце - PullRequest
1 голос
/ 05 марта 2020

У меня есть общая проблема, когда я хочу найти значение в определенном столбце (например, A), и как только я его нашел, я хочу прочитать значение, которое находится в той же строке, но в другом столбце (например, B) , Обратите внимание, что у меня обычно есть 300 столбцов с длинным именем (например, TIME = 2020-02-26 13:13:29)

Вот так выглядят некоторые из моих данных:

Time (min)  Fluo at 505 nm  Fluo at 483 nm
0   6009.5287   7779.00879
10  5843.4019   7579.47199
20  5767.2625   7516.12249
30  5744.7249   7508.69999
40  5757.8681   7505.58810
50  5725.5031   7477.69310
60  5735.7887   7457.96376
70  5738.6775   7459.54250
80  5728.7831   7435.29809
90  5689.1200   7436.50999

Я хочу найти максимальное значение в «Fluo при 505 нм» и «Fluo при 483 нм», а затем найти момент времени, когда у меня есть максимум.

Пока у меня есть это (я также пытался с .max() и .idxmax(), но это, очевидно, дает тот же результат).:

import numpy as np
import pandas as pd

data = np.loadtxt('TestData.txt', skiprows=1)
df = pd.DataFrame(data)
Fluo = data[:,1:]
df_max = np.amax(Fluo, axis = 0)
df_position = np.argmax(Fluo, axis = 0)
print(df_position)

Проблема в том, что таким образом я получаю индекс, где максимум, но не момент времени.

Это вывод:

[224 228 235 224 232 236 230 230 232 223 231 233 221 220 225 229 232 232 ... 193 196 196 204 190
 196 194]

Проблема кажется такой простой, но я застрял на ней больше недели. Надеюсь найти простое решение.

Ответы [ 3 ]

0 голосов
/ 05 марта 2020

Вы можете использовать .idxmax(), а затем использовать индекс с .loc[], чтобы получить желаемое значение. Например:

data = [{'time': 0, 'fluo1': 6009.5287, 'fluo2': 7779.008790000001},
 {'time': 10, 'fluo1': 5843.4019, 'fluo2': 7579.471990000001},
 {'time': 20, 'fluo1': 5767.2625, 'fluo2': 7516.122490000001},
 {'time': 30, 'fluo1': 5744.7249, 'fluo2': 7508.699990000001},
 {'time': 40, 'fluo1': 5757.8681, 'fluo2': 7505.5881},
 {'time': 50, 'fluo1': 5725.5031, 'fluo2': 7477.6931},
 {'time': 60, 'fluo1': 5735.7887, 'fluo2': 7457.96376},
 {'time': 70, 'fluo1': 5738.6775, 'fluo2': 7459.5425},
 {'time': 80, 'fluo1': 5728.7831, 'fluo2': 7435.29809},
 {'time': 90, 'fluo1': 5689.12, 'fluo2': 7436.5099900000005}]
df = pd.DataFrame(data)
df.loc[df['fluo2'].idxmax(), 'time']
0 голосов
/ 05 марта 2020

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

df['Time (min)'].loc[[df['Fluo at 505 nm'].idxmax(),df['Fluo at 483 nm'].idxmax()]]
0 голосов
/ 05 марта 2020

Используйте idxmax, чтобы получить индекс максимального значения в каждом столбце и создать новую серию из результата, используя столбец времени в качестве имени серии и оставшиеся столбцы в качестве индекса.

В приведенном ниже примере я изменил ваши образцы данных таким образом, чтобы максимальное значение второго столбца (Fluo at 483 nm) было в последней строке (Time (min) значение 90). Наличие максимального значения в первой строке немного сбивает с толку для примера, так как и индекс 0, и время 0 одинаковы. Максимальное значение для разных значений делает пример более реалистичным c.

df.iat[-1, -1] = 10000
>>> pd.Series(
        df[df.columns[0]].loc[df.iloc[:, 1:].idxmax()].tolist(), 
        index=df.columns[1:],
        name=df.columns[0]
    )
Fluo at 505 nm     0
Fluo at 483 nm    90
Name: Time (min), dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...