Python 数据帧-根据条件获取索引值

Python 数据帧-根据条件获取索引值,python,python-3.x,pandas,numpy,dataframe,Python,Python 3.x,Pandas,Numpy,Dataframe,我有一个名为data.txt的文本文件,其中包含表格数据,如下所示: PERIOD CHANNELS 1 2 3 4 5 0 1.51 1.61 1.94 2.13 1.95 5 1.76 1.91 2.29 2.54 2.38 6 2.02 2.22 2.64 2.96 2.81 7

我有一个名为data.txt的文本文件,其中包含表格数据,如下所示:

                        PERIOD
CHANNELS    1      2      3      4       5 
0         1.51   1.61   1.94   2.13   1.95 
5         1.76   1.91   2.29   2.54   2.38 
6         2.02   2.22   2.64   2.96   2.81 
7         2.27   2.52   2.99   3.37   3.24 
8         2.53   2.83   3.35   3.79   3.67 
9         2.78   3.13   3.70   4.21   4.09 
10        3.04   3.44   4.05   4.63   4.53
通道列中为仪器的通道编号,其他5列中为该特定通道分别在周期1、2、3、4和5中可检测到的最大能量


我想编写一个python代码,从用户那里获取输入:周期、低能量和高能量,然后给出给定周期内与低能量和高能量对应的通道号

例如:

Enter the period:
>>1
Enter the Lower energy:
>1.0
Enter the Higher energy:
>2.0
#Output
The lower energy channel is 0
The higher energy channel is 6
这是我到目前为止写的:

import numpy as np
import pandas as pd

period = int(input('Enter the period: '))
lower_energy = float(input('Enter the lower energy value: '))
higher_energy = float(input('Enter the higher energy value: '))
row_names = [0, 5, 6, 7, 8, 9, 10]
column_names = [1, 2, 3, 4, 5] 
data_list = []
with open('data.txt') as f:
lines = f.readlines()[2:]
for line in lines:
    arr = [float(num) for num in line.split()[1:]]
    data_list.append(arr)
df = pd.DataFrame(data_list, columns=column_names, index=row_names)
print (df, '\n')
print (df[period])

请帮我补充一下。

实际上,您可以使用Pandas直接读取文件,以简化程序。 我可以通过以下方式再现您期望的输出:

import pandas as pd

df = pd.read_csv('data.txt', engine='python' header=1,sep=r'\s{2,}')

period = input('Enter the period: ')
lower_energy = float(input('Enter the lower energy value: '))
higher_energy = float(input('Enter the higher energy value: '))

# select the channels within the ranges provided
lo_e_range = (df[period] > lower_energy)
hi_e_range = (df[period] > higher_energy)

# Indices of the lower and higher energy channels
lec = df[period][lo_e_range].index[0]
hec = df[period][hi_e_range].index[0]

print('The lower energy channel is {}'.format(df['CHANNELS'][lec]))
print('The higher energy channel is {}'.format(df['CHANNELS'][hec]))

我对代码进行了编辑,以考虑您的评论。

您实际上可以使用Pandas直接读取文件,以简化程序。 我可以通过以下方式再现您期望的输出:

import pandas as pd

df = pd.read_csv('data.txt', engine='python' header=1,sep=r'\s{2,}')

period = input('Enter the period: ')
lower_energy = float(input('Enter the lower energy value: '))
higher_energy = float(input('Enter the higher energy value: '))

# select the channels within the ranges provided
lo_e_range = (df[period] > lower_energy)
hi_e_range = (df[period] > higher_energy)

# Indices of the lower and higher energy channels
lec = df[period][lo_e_range].index[0]
hec = df[period][hi_e_range].index[0]

print('The lower energy channel is {}'.format(df['CHANNELS'][lec]))
print('The higher energy channel is {}'.format(df['CHANNELS'][hec]))

我已根据您的评论编辑了代码。

您可以添加以下代码:

根据条件检索索引。假设沿通道不断增加

lower_channel_energy = df[df[period]>lower_energy].index[0]
high_channel_energy =  df[(df[period]<higher_energy).shift(-1)==False].index[0]

此解决方案假设下降通道上的能量增加

您可以添加以下代码:

根据条件检索索引。假设沿通道不断增加

lower_channel_energy = df[df[period]>lower_energy].index[0]
high_channel_energy =  df[(df[period]<higher_energy).shift(-1)==False].index[0]


此解决方案假设下降通道上的能量增加

我不确定实际的问题是什么?我想写一个python代码,从用户那里获取输入:周期、低能量和高能量,然后给出给定周期内低能量和高能量对应的通道号。您选择高能量和低能量通道的标准不清楚。例如,如果用户为更高能量输入
2.0
,那么返回的更高能量频道不应该是
5
,因为
2.0
2.02
1
期间?请澄清。周期列是通道可以检测到的最大能量值。对于周期=1,通道5最多只能检测到1.76。然而,较高的能量值=2.0大于。因此,正确的输出应该是通道6,因为它是一个高达2.02的检测。我不确定实际的ask/问题是什么?我想写一个python代码来获取输入:Period,低能量和高能量,然后给出给定时间段内与低能量和高能量对应的频道号。您选择高能量和低能量频道的标准不清楚。例如,如果用户为更高能量输入
2.0
,那么返回的更高能量频道不应该是
5
,因为
2.0
2.02
1
期间?请澄清。周期列是通道可以检测到的最大能量值。对于周期=1,通道5最多只能检测到1.76。然而,较高的能量值=2.0大于。因此,正确的输出应该是通道6,因为它是一个高达2.02的检测。它不是一个打字错误。周期列是通道可以检测到的最大能量值。对于周期=1,通道5最多只能检测到1.76。然而,较高的能量值=2.0大于。因此,正确的输出应该是通道6,因为它是一个高达2.02的检测。我已经编辑了代码以考虑您的评论。这不是一个打字错误。周期列是通道可以检测到的最大能量值。对于周期=1,通道5最多只能检测到1.76。然而,较高的能量值=2.0大于。因此,正确的输出应该是通道6,因为它是一个高达2.02的检测。我编辑了代码以考虑您的评论。这不起作用。它给了我输出-对于任何输入,低能量通道是0,高能量通道是10。很抱歉犯了一个错误,但这应该可以解决您的问题。它本身就可以工作。但是,我仍然没有得到预期的通道值作为输出。周期列是通道可以检测到的最大能量值。例如,对于周期=1,能量=2.0。通道5最多只能检测1.76。然而,能量值=2.0大于。因此,正确的输出应该是通道6,因为它是一个高达2.02的检测。现在,我得到的频道号在我期望的频道号之前。好的,这不是问题,只要删除
.shift(-1)
。我认为要求是前面的要求,因为2.0小于2.2。这不起作用。它给了我输出-对于任何输入,低能量通道是0,高能量通道是10。很抱歉犯了一个错误,但这应该可以解决您的问题。它本身就可以工作。但是,我仍然没有得到预期的通道值作为输出。周期列是通道可以检测到的最大能量值。例如,对于周期=1,能量=2.0。通道5最多只能检测1.76。然而,能量值=2.0大于。因此,正确的输出应该是通道6,因为它是一个高达2.02的检测。现在,我得到的频道号在我期望的频道号之前。好的,这不是问题,只要删除
.shift(-1)
。我认为要求是前面的要求,因为2.0小于2.2。