我在 pandas 中遇到了一些奇怪的行为,我希望有人能够从 pandas 数据框中的
df.assign(...)
函数中阐明一些细节。尽管该函数有效,但尝试分配给列时,我得到了 ValueError
。
def is_toc_row(row):
m_sig = m_df.loc[m_df.signature == row.signature]
pct = (~pd.isnull(m_sig.line_type)).sum() / m_sig.shape[0]
return (not pd.isnull(row.line_type)) or (pct < .5)
m_df = m_df.assign(is_toc_row=is_toc_row)
给予:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
但这完全没问题:
for ind, row in m_df.iterrows():
m_df.at[ind, 'is_toc_row'] = is_toc_row(row)
在函数中引用 DataFrame 的其余部分是否存在问题?我在 docs 中看到的只是主题 df 无法更改,但事实并非如此。
当然,我有能力构建一个解决方法,我只是想了解为什么这对将来的使用不起作用。
我认为你的错误来自于你的分配函数中的
is_toc_row = is_toc_row
,因为这是试图比较2个系列名称is_toc_row(有关此错误的更多信息可以在这个答案中找到,但我不认为分配是负责任的)。 IIUC,要使分配按照您想要的方式工作,您需要在 lambda 函数中调用该函数。 这是我的意思的 MRE:
df = pd.DataFrame({'Foo':[1,2,3,4,5], 'Bar':[6,7,8,9,10]})
Boo bar
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10
要分配的功能:
def function(x):
return x['Foo'] * x['Bar']
然后使用以下方法将其输出指定为
new_col
:
df.assign(new_col = lambda x:function(x))
哪个输出:
Boo bar new_col
0 1 6 6
1 2 7 14
2 3 8 24
3 4 9 36
4 5 10 50