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
我将通过比较
Value
和Num
注释每一行 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/