df看起来像这样

s = {0: [np.nan, 'a' ,'b', 'c', 'd'],
    1: ['A', '8(F)', '6', '8', '4(F)'],
    2: ['B', '1', '6', '8(F)', '3(F)'],
    3: ['C', '1', '8', '8', '1'],
    4: ['D', '1', '2(F)', '6', '8']}

df = pd.DataFrame(data=s)

     0     1     2    3     4
0  NaN     A     B    C     D
1    a  8(F)     1    1     1
2    b     6     6    8  2(F)
3    c     8  8(F)    8     6
4    d  4(F)  3(F)    1     8


首先,我要选择带有(F)的数据并在新数据框上列出

  Value
0  8(F)
1  4(F)
2  8(F)
3  3(F)
4  2(F)


其次,我要添加大写字母

  Value  Upper
0  8(F)   A
1  4(F)   A
2  8(F)   B
3  3(F)   B
4  2(F)   D


以及小写字母

  Value  Upper Lower
0  8(F)   A     a
1  4(F)   A     d
2  8(F)   B     c
3  3(F)   B     d
4  2(F)   D     b


最后,我想根据下表对每一行进行评论

  Upper Lower  Num
0   A     a     9
1   A     b     1
2   A     c     2
3   A     d     3
4   B     a     0
5   B     b     4
6   B     c     8
7   B     d     3
8   C     a     4
9   C     b     8
10  C     c     4
11  C     d     6
12  D     a     4
13  D     b     1
14  D     c     4
15  D     d     3


我将通过比较ValueNum注释每一行

  Value  Upper Lower Comment
0  8(F)   A     a    smaller
1  4(F)   A     d    bigger
2  8(F)   B     c    equal
3  4(F)   B     d    equal
4  2(F)   D     b    smaller


请注意,我不想在代码中使用任何for循环。
希望有人可以帮助我解决这个烦人的问题。

最佳答案

这是使用merge并与df1比较的一种方法

df=df.astype(str)
s=df[df.applymap(lambda x : '(F)' in x)].stack().rename_axis(['Lower','Upper']).reset_index()

s['Comment']=np.sign((s[0].str.split('(').str[0].astype(int)-s.merge(df1).Num)).map({-1:'lt',0:'eq',1:'gt'})
s
Out[753]:
  Lower Upper     0 Comment
0     a     A  8(F)      lt
1     b     D  2(F)      gt
2     c     B  8(F)      eq
3     d     A  4(F)      gt
4     d     B  3(F)      eq

关于python - 处理数据框以实现多个目标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57080245/

10-13 08:50
查看更多