如果条目序列符合条件,则返回Dataframe?

时间:2018-02-20 21:02:27

标签: python-3.x pandas dataframe

假设我有一个数据帧A列表,其中每个数据帧的构造如下:

df =    'Subject ID'  'Score'
        a              20
        b              25
        c              30
        d              35
        e              40

现在,我想返回包含A中每个数据帧的另一个列表,使得根据得分的主题序列是< b将c< d< e。到目前为止,我已经尝试了一些类似的事情:

for df in A:
    ascore=(df.get_value(1,1, takeable=True)))
    bscore=(df.get_value(2,2, takeable=True)))
    cscore=(df.get_value(3,3, takeable=True)))
    dscore=(df.get_value(3,3, takeable=True)))
    escore=(df.get_value(3,3, takeable=True)))
    if ascore<bscore<cscore<dscore<escore:
        newlist.append(df)

是否有一种方法可以很好地处理pandas,或者我应该将数据帧转换为另一个对象并使用嵌套的if语句?任何帮助,将不胜感激!

2 个答案:

答案 0 :(得分:3)

IIUC

l=[df1,df]

s=[(x['SubjectID'].rank() == x['Score'].rank()).all() for x in l ]


from itertools import compress

list(compress(l, s))

Out[1040]: 
[  SubjectID  Score
 0         a     20
 1         b     25
 2         c     30
 3         d     35
 4         e     40]

数据输入

df1
Out[1041]: 
  SubjectID  Score
0         a     20
1         b     25
2         c     60
3         d     35
4         e     40

df
Out[1042]: 
  SubjectID  Score
0         a     20
1         b     25
2         c     30
3         d     35
4         e     40

答案 1 :(得分:2)

您可以使用pd.Series.is_monotonic_increasing

s = df.sort_values(by='Subject ID')['Score']
s.is_monotonic_increasing

输出:

True

现在,让我们创建一些数据:

df1 = df.copy()
df2 = df.copy()
df3 = df.copy()
df2.loc[4,'Score'] = 1  #non increasing scores
df3.loc[2,'Score'] = 4  #non increasing scores

l = [df1,df2,df3]

[i for i in l if i.sort_values(by='Subject ID')['Score'].is_monotonic_increasing]

输出:

#df1 which is othe only dataframe with increasing scores
[  Subject ID  Score
 0          a     20
 1          b     25
 2          c     30
 3          d     35
 4          e     40]