根据每个时间序列的条件识别 DataFrame 中的时间点
Identify time point in DataFrame based on condition per time series
我有一个包含时间序列数据的 DataFrame,如下所示:
(TP =时间点)
gene number TP1 TP2 TP3 TP4 TP5 TP6
gene1 0.4 0.2 0.1 0.5 0.8 1.9
gene2 0.3 0.05 0.5 0.8 1.0 1.7
....
对于每一行(基因),我想确定其值达到时间序列中最小值 4 倍的水平的 TP,附加条件是该确定的 TP 必须在最低TP。因此,对于基因 2,我对 TP3 而不是 TP1 感兴趣(它比 TP2 的最小值大 4 倍),因为 TP1 在系列中比最小 TP2 早。
所以我尝试构建的脚本的结果是这样的:
gene1 TP4
gene2 TP3
...
我的数据在一个 numpy 数组中。
这里有一个方法:
df =pd.DataFrame({'TP1':[.4,.3],'TP2':[.2,.05],'TP3':[.1,.5],'TP4':[.5,.8],'TP5':[.8,1.0], 'TP6':[1.9,1.7]},index= ['gene1','gene2'])
def f(x):
#get min value and index
min_ind = [ e for e in enumerate(x) if e[1] == x.min()]
#return only the first value that is greater than the index of the min value and > min value *4
r =df.columns[[e[0] for e in enumerate(x) if e[1] if e[1] > min_ind[0][1]*4 and e[0]> min_ind[0][0]][0]]
return r
returns:
df.apply(f, axis=1)
gene1 TP4
gene2 TP3
dtype: object
您可以先创建一个掩码 ma
并将最小值之前的所有行值设置为 False
。接下来,使用此掩码找到每一行中的值 在 最小值之后达到最小值的 4 倍(由 True
表示):
>>> ma = df.values.argmin(axis=1)[:,None] <= np.arange(df.shape[1])
>>> df.ge(4*df.min(axis=1), axis=0) & ma
TP1 TP2 TP3 TP4 TP5 TP6
gene1 False False False True True True
gene2 False False True True True True
然后您可以使用 idxmax
:
从这个布尔数据帧(我将其称为 df1
)中检索第一个 True
值的标签
>>> df1.idxmax(axis=1)
gene1 TP4
gene2 TP3
dtype: object
我有一个包含时间序列数据的 DataFrame,如下所示:
(TP =时间点)
gene number TP1 TP2 TP3 TP4 TP5 TP6
gene1 0.4 0.2 0.1 0.5 0.8 1.9
gene2 0.3 0.05 0.5 0.8 1.0 1.7
....
对于每一行(基因),我想确定其值达到时间序列中最小值 4 倍的水平的 TP,附加条件是该确定的 TP 必须在最低TP。因此,对于基因 2,我对 TP3 而不是 TP1 感兴趣(它比 TP2 的最小值大 4 倍),因为 TP1 在系列中比最小 TP2 早。
所以我尝试构建的脚本的结果是这样的:
gene1 TP4
gene2 TP3
...
我的数据在一个 numpy 数组中。
这里有一个方法:
df =pd.DataFrame({'TP1':[.4,.3],'TP2':[.2,.05],'TP3':[.1,.5],'TP4':[.5,.8],'TP5':[.8,1.0], 'TP6':[1.9,1.7]},index= ['gene1','gene2'])
def f(x):
#get min value and index
min_ind = [ e for e in enumerate(x) if e[1] == x.min()]
#return only the first value that is greater than the index of the min value and > min value *4
r =df.columns[[e[0] for e in enumerate(x) if e[1] if e[1] > min_ind[0][1]*4 and e[0]> min_ind[0][0]][0]]
return r
returns:
df.apply(f, axis=1)
gene1 TP4
gene2 TP3
dtype: object
您可以先创建一个掩码 ma
并将最小值之前的所有行值设置为 False
。接下来,使用此掩码找到每一行中的值 在 最小值之后达到最小值的 4 倍(由 True
表示):
>>> ma = df.values.argmin(axis=1)[:,None] <= np.arange(df.shape[1])
>>> df.ge(4*df.min(axis=1), axis=0) & ma
TP1 TP2 TP3 TP4 TP5 TP6
gene1 False False False True True True
gene2 False False True True True True
然后您可以使用 idxmax
:
df1
)中检索第一个 True
值的标签
>>> df1.idxmax(axis=1)
gene1 TP4
gene2 TP3
dtype: object