尝试使用 apply 对 Panda DataFrame 中的不同键进行操作
Trying to use apply to make operations over different keys in a Panda DataFrame
我有一个看起来有点像这样的 Panda DataFrame:
df = pd.DataFrame({'ID' : ['O60829','O60341','Q9H1R3'], 'TOTAL_COVERAGE' : ['yes','yes','no'], 'BEG_D' : ['1','1','500'], 'END_D' : ['102','25','600'], 'BEG_S' : ['1','1','1'], 'END_S': ['102','25','458']})
我想迭代每一行,检查 'TOTAL_COVERAGE' 的值,如果它是 'yes',则对其他值执行数学运算,即:
for index, row in df.iterrows():
df['%'] = df.apply(lambda x : ((int(x['END_S'])*100)/int(x['END_D'])) if x['TOTAL_COVERAGE'] == 'yes' else '')
但我收到错误消息:KeyError: 'TOTAL_COVERAGE'
必须有一个我没有看到的简单修复方法。提前致谢!
你可以用向量化的方法解决它,不需要 iterrows
和 apply
:
df['%'] = (df['END_S'].astype(int) * 100 / df['END_D'].astype(int)) \
.where(df['TOTAL_COVERAGE'] == 'yes')
df
# ID TOTAL_COVERAGE BEG_D END_D BEG_S END_S %
#0 O60829 yes 1 102 1 102 100.0
#1 O60341 yes 1 25 1 25 100.0
#2 Q9H1R3 no 500 600 1 458 NaN
您得到 keyError 的原因是因为当您使用 apply
时,lambda x
的参数是一个列(pandas 系列),它不能用于通过名称访问特定列。
你可以不使用 iterrows
和 apply
,直接等同于:
df['%'] = ''
df.loc[df['TOTAL_COVERAGE'] == 'yes', '%'] =
df['END_S'].astype(int) * 100 / df['END_D'].astype(int)
没有必要iterrows()
。可以使用 numpy.where()
完成条件逻辑,以提供更有效的解决方案
df = pd.DataFrame({'ID' : ['O60829','O60341','Q9H1R3'], 'TOTAL_COVERAGE' : ['yes','yes','no'], 'BEG_D' : ['1','1','500'], 'END_D' : ['102','25','600'], 'BEG_S' : ['1','1','1'], 'END_S': ['102','25','458']})
df = (df
.assign(pct=lambda x: np.where(x["TOTAL_COVERAGE"].eq("yes"),(x['END_S'].astype(int)*100)/x['END_D'].astype(int), np.nan))
.rename(columns={"pct":"%"})
)
输出
ID TOTAL_COVERAGE BEG_D END_D BEG_S END_S %
O60829 yes 1 102 1 102 100.0
O60341 yes 1 25 1 25 100.0
Q9H1R3 no 500 600 1 458 NaN
我有一个看起来有点像这样的 Panda DataFrame:
df = pd.DataFrame({'ID' : ['O60829','O60341','Q9H1R3'], 'TOTAL_COVERAGE' : ['yes','yes','no'], 'BEG_D' : ['1','1','500'], 'END_D' : ['102','25','600'], 'BEG_S' : ['1','1','1'], 'END_S': ['102','25','458']})
我想迭代每一行,检查 'TOTAL_COVERAGE' 的值,如果它是 'yes',则对其他值执行数学运算,即:
for index, row in df.iterrows():
df['%'] = df.apply(lambda x : ((int(x['END_S'])*100)/int(x['END_D'])) if x['TOTAL_COVERAGE'] == 'yes' else '')
但我收到错误消息:KeyError: 'TOTAL_COVERAGE'
必须有一个我没有看到的简单修复方法。提前致谢!
你可以用向量化的方法解决它,不需要 iterrows
和 apply
:
df['%'] = (df['END_S'].astype(int) * 100 / df['END_D'].astype(int)) \
.where(df['TOTAL_COVERAGE'] == 'yes')
df
# ID TOTAL_COVERAGE BEG_D END_D BEG_S END_S %
#0 O60829 yes 1 102 1 102 100.0
#1 O60341 yes 1 25 1 25 100.0
#2 Q9H1R3 no 500 600 1 458 NaN
您得到 keyError 的原因是因为当您使用 apply
时,lambda x
的参数是一个列(pandas 系列),它不能用于通过名称访问特定列。
你可以不使用 iterrows
和 apply
,直接等同于:
df['%'] = ''
df.loc[df['TOTAL_COVERAGE'] == 'yes', '%'] =
df['END_S'].astype(int) * 100 / df['END_D'].astype(int)
没有必要iterrows()
。可以使用 numpy.where()
完成条件逻辑,以提供更有效的解决方案
df = pd.DataFrame({'ID' : ['O60829','O60341','Q9H1R3'], 'TOTAL_COVERAGE' : ['yes','yes','no'], 'BEG_D' : ['1','1','500'], 'END_D' : ['102','25','600'], 'BEG_S' : ['1','1','1'], 'END_S': ['102','25','458']})
df = (df
.assign(pct=lambda x: np.where(x["TOTAL_COVERAGE"].eq("yes"),(x['END_S'].astype(int)*100)/x['END_D'].astype(int), np.nan))
.rename(columns={"pct":"%"})
)
输出
ID TOTAL_COVERAGE BEG_D END_D BEG_S END_S %
O60829 yes 1 102 1 102 100.0
O60341 yes 1 25 1 25 100.0
Q9H1R3 no 500 600 1 458 NaN