Pandas 按行比较数据,仅针对特定列

51 阅读2分钟

给定一个 Pandas 数据框,其中包含多列数据和一个参考行。我们需要比较数据框中各行与参考行的特定列,并根据比较结果在数据框中添加一个新列以指示行是否满足条件。

2. 解决方案

为了解决这个问题,我们可以使用 Pandas 提供的各种数据操作函数和循环语句。

第一步,我们将创建一个字典,将列名列表作为键,将范围名称列表作为值。这有助于我们在比较时快速访问范围名称。

conditions = {0: list('DFA'),
              1: list('ACEF'),
              2: list('CEF'),
              3: list('ABDF'),
              4: list('DEF'),
              5: list('AC'),
              6: list('ABCDE')}
range_name_list = ['Base','Curnt','Prediction','Graph','Swg','Barometer_Output','Test_Cntr']

第二步,我们将使用 iterrows() 函数遍历数据框中的每一行,并使用 ix 方法访问每一行的值。

for index, row in df.iterrows():

第三步,我们将使用 truths 列表来存储每一行中满足比较条件的列的布尔值。如果 truths 列表中所有值都为 True,则表示该行满足比较条件。

truths = [row[column] > df_base_val[column] for column in list]
if sum(truths) == len(truths):

第四步,如果该行满足比较条件,我们将使用 ix 方法在 Range 列中设置该行对应的值。

df.ix[index, 'Range'] = df.ix[index, 'Range'] + range_name_list[ix] + "|"

第五步,如果该行不满足任何比较条件,我们将使用 ix 方法在 Range 列中设置 Not_in_Range 值。

df['Range'][df['Range'] == '|'] = 'Not_in_Range'

最后,我们可以使用 print(df) 语句来输出结果。

print(df)

代码例子

import pandas as pd

df = pd.DataFrame({'Temp_Fact': ['A', 'B', 'A', 'A', 'C', 'E', 'D', 'F', 'C', 'C', 'B', 'B', 'E', 'D', 'F', 'D', 'E', 'F', 'E', 'C', 'B', 'F', 'B', 'F', 'C', 'C', 'C', 'E'],
                   'Oscillops_read': ['Today', 'Today', 'Aactl', 'DFE', 'Real_Mt_Olv', 'Q_Mont', 'DFE', 'Bryo', 'Aactl', 'Today', 'Pars', 'Pars', 'Tomorrow', 'DFE', 'Q_Mont', 'Last_Week', 'Last_Week', 'Bryo', 'Bryo', 'Tomorrow', 'Last_Week', 'Tomorrow', 'Aactl', 'Last_Week', 'Today', 'Pars', 'Tomorrow', 'Bryo'],
                   'A': [0.710213, 0.653489, 0.129211, 0.743794, 0.724282, 0.221685, 0.655386, 0.257884, 0.017388, 0.197419, 0.637346, 0.768422, 0.860112, 0.801734, 0.360710, 0.867126, 0.551499, 0.511370, 0.323441, 0.267086, 0.951356, 0.963750, 0.291186, 0.269308],
                   'B': [0.222015, 0.452543, 0.579690, 0.355085, 0.332965, 0.224834, 0.561297, 0.228650, 0.133848, 0.595253, 0.090000, 0.017828, 0.532859, 0.365921, 0.330745, 0.600093, 0.724981, 0.208831, 0.663328, 0.357918, 0.570077, 0.118826, 0.126748, 0.655920],
                   'C': [0.814710, 0.618755, 0.641324, 0.637794, 0.063078, 0.110734, 0.305310, 0.413149, 0.939049, 0.574718, 0.848710, 0.090141, 0.091641, 0.243407, 0.598830, 0.813257, 0.821087, 0.260223, 0.951847, 0.562190, 0.867533, 0.264858, 0.154725, 0.595518],
                   'D': [0.597732, 0.555629, 0.615772, 0.633634, 0.004550, 0.397999, 0.140998, 0.285651, 0.159416, 0.373899, 0.596883, 0.108061, 0.768896, 0.826373, 0.582379, 0.005423, 0.175279, 0.089106, 0.782042, 0.700404, 0.365708, 0.571066, 0.527029, 0.404817],
                   'E': [0.634099, 0.490342, 0.927384, 0.810033, 0.585398, 0.814153, 0.433054, 0.814095, 0.923788, 0.363200, 0.027026, 0.456734, 0.635966, 0.904416, 0.828019, 0.617543, 0.301397, 0.121442, 0.909736, 0.961047, 0.791373, 0.761669, 0.021485, 0.290342],
                   'F': [0.338913, 0.280299, 0.199651, 0.509244, 0.869376, 0.552924, 0.118187, 0.275627,