【问题标题】:Pandas Dataframe - Get index values based on conditionPandas Dataframe - 根据条件获取索引值
【发布时间】:2019-01-11 08:11:56
【问题描述】:

我有一个名为 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

CHANNELS 列是仪器的通道编号,其他 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])

帮我补充一下。

【问题讨论】:

  • 我不确定实际的问题/问题是什么?
  • 我想编写一个 python 代码,它从用户那里获取输入:周期、较低能量和较高能量,然后给出与给定周期的较低能量和较高能量相对应的通道号。
  • 您选择更高和更低能量通道的标准尚不清楚。例如,如果用户输入2.0获得更高的能量,那么在1期间2.0 2.02,返回的更高能量通道不应该是5吗?请澄清。
  • 周期列是通道可以检测到的最大能量值。对于 Period = 1,通道 5 最多只能检测到 1.76。而较高的能量值 = 2.0 大于。因此正确的输出应该是通道 6,因为它可以检测到 2.02。

标签: python python-3.x pandas numpy dataframe


【解决方案1】:

您可以添加以下代码:

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

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

打印我们计算的通道:

print("The lower energy channel is {}".format(lower_channel_energy))
print("The higher energy channel is {}".format(high_channel_energy))

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

【讨论】:

  • 这不起作用。它给了我输出 - 对于任何输入,较低的能量通道是 0,较高的能量通道是 10。
  • 抱歉弄错了,但这应该可以解决您的问题。
  • 它本身确实有效。但是,我仍然没有得到预期的通道值作为输出。周期列是通道可以检测到的最大能量值。例如。对于周期 = 1,能量 = 2.0。通道 5 最多只能检测到 1.76。而能量值 = 2.0 大于。因此正确的输出应该是通道 6,因为它检测到 2.02。现在我得到了我期望的频道号之前的频道号。
  • 好的,这不是问题,只需删除.shift(-1)。我认为要求是前面的要求,因为 2.0 小于 2.2。
【解决方案2】:

您实际上可以使用 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]))

我已编辑代码以考虑您的评论。

【讨论】:

  • 这不是错字。周期列是通道可以检测到的最大能量值。对于 Period = 1,通道 5 最多只能检测到 1.76。而较高的能量值 = 2.0 大于。因此正确的输出应该是通道 6,因为它可以检测到 2.02
  • 我已经编辑了代码以考虑您的评论。
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2022-01-19
  • 2023-03-03
  • 2019-02-18
  • 2018-01-20
相关资源
最近更新 更多