假设我有一个数据帧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语句?任何帮助,将不胜感激!
答案 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]