如何解决熊猫1.1.0的应用功能在原位置更改行
我有一个小的DF(2行x 4cols)。一旦执行apply
,该函数将根据某些逻辑添加额外的列。使用Pandas 0.24.2
,我一直以df.apply(func,axis=1)
的身份来做,我会得到我的额外专栏。到目前为止,一切都很好。
现在,熊猫1.1.0
发生了一些奇怪的事情:当我apply
时,第一行被处理两次,而第二行甚至都没有考虑。
我将显示原始DF,预期的DF和功能。我添加了一个print(row)
,因此您可以看到DF的第一个row
是如何重复的。
In [82]: df_attr_list
Out[82]:
name attrName string_value dict_value
0 FW12611 HW type None ALU1
1 FW12612 HW type None ALU1
现在,该函数及其输出...
def setFinalValue(row):
rtrName = row['name']
attrName = row['attrName'].replace(" ","")
dict_value = row['dict_value']
string_value = row['string_value']
finalValue = 'N/A'
if attrName in ['Val1','Val2','Val3']:
finalValue = dict_value
elif attrName in ['Val4','Val5',]:
finalValue = string_value
else:
finalValue = "N/A"
row['finalValue'] = finalValue
print(row)
return row
现在,在apply
之后的输出...
In [83]: df_attr_list.apply(setFinalValue,axis=1)
name FW12611
attrName HW type
string_value None
dict_value ALU1
finalValue ALU1
Name: 0,dtype: object
name FW12611
attrName HW type
string_value None
dict_value ALU1
finalValue ALU1
Name: 1,dtype: object
Out[83]:
name attrName string_value dict_value finalValue
0 FW12611 HW type None ALU1 ALU1
1 FW12611 HW type None ALU1 ALU1
如您所见,添加了额外的列,但是原始DF的第一行被处理了两次,好像第二行不存在...
为什么会这样?
我已经在尝试使用熊猫1.1.0 ...
In [86]: print(pd.__version__)
1.1.0
谢谢!
解决方法
- 根据Pandas 1.1.0 What's New Doc: apply and applymap on DataFrame evaluates first row/column only once,
['\n',<div class="ex_example"> aa </div>,'\n','\n']
不会对第一行进行两次评估。 - 问题是,返回
.apply
时将替换数据帧。- 这似乎是BUG: DataFrame.apply with func altering row in-place #35633的结果
- 删除
row
并返回row['finalValue'] = finalValue
而不是finalValue
。
- 使用
row
调用函数。
df['finalValue'] = df.apply(setFinalValue,axis=1)
,
也可以使用np.select
以矢量化方式实现此要求。
short_name = df["attrName"].str.replace(' ','')
conditions = [short_name.isin(['Val1','Val2','Val3']),short_name.isin(['Val4','Val5'])]
df["finalValue"] = np.select(conditions,df[["dict_value","string_value"]],"N/A")
输出:
name attrName string_value dict_value finalValue
0 FW12611 HW type None ALU1 N/A
1 FW12612 HW type None ALU1 N/A
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。