1 回答
TA贡献1963条经验 获得超6个赞
ttype
我会合并和列上的数据框,mtype
类似于在 Excel 中执行索引匹配/vlookup,但您不想合并整个moc
数据框,因此只需指定并合并您需要的列 (mtype
和ma
)。从那里,只需执行一个操作
np.where
以查看ta
值是否大于ma
值并返回1
或0
类似于 Excelif
公式。最后,删除不需要的列
输入:
import pandas as pd, numpy as np
toc = {'ttype':['ta1k', 'brek', 'sjfgd',
'gru2d','brek','crhe','ta1k','jump4'],
'ta':[1, 2, 9, 9, 2, 2, 1, 1],
'tc':[0, 1, 0, 0, 1, 0, 2, 0],
'outfilter':[0, 0, 0, 0,0, 0, 0, 0]}
toc = pd.DataFrame(toc)
moc = {'mtype':[ 'sjfgd','ta1k','gru2d',
'brek','crhe','jump4'],
'mo':[2, 2, 4, 4, 3, 4],
'ma':[2, 2, 4, 4, 2, 3],
'mc':[1, 1, 3, 3, 1, 1]}
moc = pd.DataFrame(moc)
代码:
toc = pd.merge(toc,moc[['mtype','ma']],how='left',left_on='ttype',right_on='mtype')
toc['outfilter'] = np.where((toc['ta'] > toc['ma']),1,0)
toc = toc.drop(['mtype','ma'], axis=1)
toc
逐行分解代码:
步骤 1(类似于 excelindex-match公式):
pd.merge(toc,moc[['mtype','ma']],how='left',left_on='ttype',right_on='mtype')
ttype ta tc outfilter mtype ma
0 ta1k 1 0 0 ta1k 2
1 brek 2 1 0 brek 4
2 sjfgd 9 0 0 sjfgd 2
3 gru2d 9 0 0 gru2d 4
4 brek 2 1 0 brek 4
5 crhe 2 0 0 crhe 2
6 ta1k 1 2 0 ta1k 2
7 jump4 1 0 0 jump4 3
第 2 步(类似于 excelIF公式):
toc['outfilter'] = np.where((toc['ta'] > toc['ma']),1,0)
ttype ta tc outfilter mtype ma
0 ta1k 1 0 0 ta1k 2
1 brek 2 1 0 brek 4
2 sjfgd 9 0 1 sjfgd 2
3 gru2d 9 0 1 gru2d 4
4 brek 2 1 0 brek 4
5 crhe 2 0 0 crhe 2
6 ta1k 1 2 0 ta1k 2
7 jump4 1 0 0 jump4 3
第 3 步 - 最终输出(仅删除不需要的列):
toc = toc.drop(['mtype','ma'], axis=1)
ttype ta tc outfilter
0 ta1k 1 0 0
1 brek 2 1 0
2 sjfgd 9 0 1
3 gru2d 9 0 1
4 brek 2 1 0
5 crhe 2 0 0
6 ta1k 1 2 0
7 jump4 1 0 0
如果我多想一点,可能有一种更简单的方法可以在 python 中使用 pandas 方法仅使用一行 cod 来执行此操作,但这种方法足够简单且易于理解。
此外,VBA 也是我大约 18 个月前从 Pandas 切换到的语言。我会说 99% 的问题都可以用 pandas 方法、列表理解或.apply(lambda x:.... Pandas 方法或 numpy 方法在简单性、速度、性能等方面始终是可行的方法。在 VBA 中循环非常流行,但您应该尽快摆脱它并学习各种 pandas方法。
添加回答
举报