在一列中查找时间点,同时在另一列中读取最大值



我有一个常见的问题,我想在某一列中找到一个值(例如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

我想在"505 nm处的Fluo"one_answers"483 nm处的Fluo"中找到最大值,然后找到我有最大值的时间点。

到目前为止,我有这个(我也尝试过.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]

这个问题看起来很容易,但我已经坚持了一个多星期了。希望能找到一个简单的解决方案。

使用idxmax获取每列中最大值的索引,并使用时间列作为序列的名称,其余列作为其索引,根据结果创建一个新的序列。

在下面的示例中,我修改了示例数据,使第二列(Fluo at 483 nm(的最大值位于最后一行(90Time (min)值(。例如,第一行的最大值有点令人困惑,因为索引0和时间0都相同。将最大值设置为不同值会使示例更加逼真。

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

您可以使用.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']

您可以使用以下命令在一行中获得两个值,如

df['Time (min)'].loc[[df['Fluo at 505 nm'].idxmax(),df['Fluo at 483 nm'].idxmax()]]

最新更新