熊猫数据框查询

时间:2018-11-28 20:44:12

标签: python pandas

我喜欢根据列名及其最小值和最大值检索数据。我无法弄清楚如何获得该结果。我能够根据列名获取数据,但不了解如何应用限制。

列名以及列表和元组中给出的相应的最小值和最大值。

import pandas as pd
import numpy as np

def c_cutoff(data_frame, column_cutoff):

    selected_data = data_frame.loc[:, [X[0] for X in column_cutoff]]

    return selected_data


np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)),
                  columns=list('ABCDEF'),
                  index=['R{}'.format(i) for i in range(100)])

column_cutoffdata = [('B',27,78),('E',44,73)]

newdata_cutoff = c_cutoff(df,column_cutoffdata)
print(df.head())


print(newdata_cutoff)

结果

    B   E
R0   78  73
R1   27   7
R2   53  44
R3   65  84
R4    9   1
..
.

预期输出 我希望所有小于27且大于78的值都应舍弃,对于E相同

2 个答案:

答案 0 :(得分:1)

您可以相当明确地执行以下操作:

lim = [('B',27,78),('E',44,73)]

for lim in limiters:
    df = df[(df[lim[0]]>=lim[1]) & (df[lim[0]]<=lim[2])]

收益:

      A   B   C   D   E   F
R0   99  78  61  16  73   8
R2   15  53  80  27  44  77
R8   30  62  11  67  65  55
R11  90  31   9  38  47  16
R15  16  64   8  90  44  37
R16  94  75   5  22  52  69
R46  11  30  26   8  51  61
R48  39  59  22  80  58  44
R66  55  38   5  49  58  15
R70  36  78   5  13  73  69
R72  70  58  52  99  67  11
R75  20  59  57  33  53  96
R77  32  31  89  49  69  41
R79  43  28  17  16  73  54
R80  45  34  90  67  69  70
R87   9  50  16  61  65  30
R90  43  56  76   7  47  62

答案 1 :(得分:1)

pipe + where + between

您不能丢弃数组中的值;这将涉及整形一个数组,而数据框的列必须都具有相同的大小。

但是您可以迭代并使用pd.Series.where来将范围外的值替换为NaN。请注意,通过函数来​​馈送数据帧的熊猫方式是通过pipe

import pandas as pd
import numpy as np

def c_cutoff(data_frame, column_cutoff):
    for col, min_val, max_val in column_cutoffdata:
        data_frame[col] = data_frame[col].where(data_frame[col].between(min_val, max_val))
    return data_frame

np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)),
                  columns=list('ABCDEF'),
                  index=['R{}'.format(i) for i in range(100)])

column_cutoffdata = [('B',27,78),('E',44,73)]

print(df.head())

#      A   B   C   D   E   F
# R0  99  78  61  16  73   8
# R1  62  27  30  80   7  76
# R2  15  53  80  27  44  77
# R3  75  65  47  30  84  86
# R4  18   9  41  62   1  82

newdata_cutoff = df.pipe(c_cutoff, column_cutoffdata)

print(newdata_cutoff.head())

#      A     B   C   D     E   F
# R0  99  78.0  61  16  73.0   8
# R1  62  27.0  30  80   NaN  76
# R2  15  53.0  80  27  44.0  77
# R3  75  65.0  47  30   NaN  86
# R4  18   NaN  41  62   NaN  82

如果要删除具有 any NaN值的行,则可以使用dropna

newdata_cutoff = newdata_cutoff.dropna()