Pandas DataFrame 无法使用分配函数 - 为什么?

问题描述 投票:0回答:1

我在 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 无法更改,但事实并非如此。

当然,我有能力构建一个解决方法,我只是想了解为什么这对将来的使用不起作用。

python python-3.x pandas dataframe
1个回答
0
投票

我认为你的错误来自于你的分配函数中的

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
© www.soinside.com 2019 - 2024. All rights reserved.