【问题标题】:Python - Compare Column Value To Row ValuePython - 将列值与行值进行比较
【发布时间】:2019-01-09 02:07:58
【问题描述】:

目前有点逻辑问题...基本上,我正在尝试将一个 CSV 的列值与另一个 CSV 中的行值进行比较。到目前为止,这是我的代码:

import tkinter as tk
from tkinter import filedialog

#import numpy as np
#import matplotlib.pyplot as plt
import pandas as pd

root = tk.Tk()
root.withdraw()

thresholdsFile = filedialog.askopenfilename(title='Select The Thresholds File:')
mDataFile = filedialog.askopenfilename(title='Select The M Data File:')

df = pd.read_csv(thresholdsFile)
df2 = pd.read_csv(mDataFile)

def thresholdCheck(thresholds, mdata):
    for index, row in thresholds.iterrows():
        for index1, row1 in mdata.iterrows():
            if (row1[index1]) < row['Minimum Threshold:']:
                print('Minimum threshold broken!')
            elif (row1[index1]) > row['Maximum Threshold:']:
                print('Maximum threshold broken!')
            else:
                print('No threshold broken!')

sampleOutput = thresholdCheck(df, df2)
print(sampleOutput)

它产生以下输出:

最低门槛突破! 最大门槛被打破! 门槛不破! 最大门槛被打破! 无

这是错误的。 :(

附件是我放在一起测试代码的两个示例 CSV。

所以它应该工作的方式是2机器数据的列值应该以垂直方式读取并与1阈值数据的水平行进行比较,所以在这种情况下它应该是这样的:

(油温)55 与 56 和 115(第一张图片中的最小/最大阈值)进行比较,触发器低于 56 ---> 最小阈值损坏

(油温)116 与 56 和 115(最小/最大阈值)进行比较,触发高于 115 ---> 最大阈值已损坏

现在

(油压机)43 与 44 和 126(最小/最大阈值)进行比较,触发低于 44 ---> 最小阈值被破坏

(油压机)127 与 44 和 126(最小/最大阈值)进行比较,触发高于 126 ---> 最大阈值被破坏

输入

df = pd.DataFrame( {'Variable Name:':['Oil Temp','Oil Press'],
                    'Minimum Threshold:':[56,44],'Maximum Threshold:':[115, 126]})

df2 = pd.DataFrame({'Oil Temp':[95,116],'Oil Press':[43,127]})

【问题讨论】:

  • 您能否在您的问题中添加print (df.head(2))print (df2.head(2)) 的结果(不是图片中的CSV)。同时,考虑将row1[index1]) 更改为row1[row['Variable Name:']]) 两次,如果我不明白你想做什么。我怀疑row1[index1]) 得到你想要的。另一个建议,像这样做两个循环for 并不是最好的,特别是如果你的 2 个数据框很大。
  • @Ben.T 非常感谢您的回复!我附上了示例输出的图片。你达到了另一个相关点。我并不难坚持这两个循环,因为其中一个数据帧相当大。如果您有更好的方法,我会全力以赴!
  • 哈哈 我误解了我添加print 的意思(我的英语并不总是很好),我的意思不是图片而是纯文本,因为任何人都更容易使用@987654336 @ 或类似的东西可以轻松获取数据。无论如何,我会尽快编辑你的帖子。另外,当你说一个数据框很大时,我假设你的意思是df2/mdata,对吧?
  • @Ben.T 你是对的。机器数据文件会更大。

标签: python-3.x pandas dataframe


【解决方案1】:

您可以执行以下操作:

## set index, easy to look up
df1 = df1.set_index('Variable Name')

# convert to dict
df2_dict = df2.to_dict(orient='list')

result = []

for k,v in df2_dict.items():
    vals = df1.loc[k].tolist()
    for j in v:

        if j < min(vals):
            result.append('minimum threshold broken')

        if j > max(vals):
            result.append('maximum threshold broken')

print(result)

['minimum threshold broken',
 'maximum threshold broken',
 'minimum threshold broken',
 'maximum threshold broken']

设置

df1 = pd.DataFrame({'Variable Name':['Oil Temp','Oil Press'],
                    'Minimum Threshold': [56, 44],
                    'Maximum Threshold': [115, 126]})

df2 = pd.DataFrame({'Oil Temp':[55, 116],
                    'Oil Press': [43, 127]})

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多