本网站的长期用户,但第一次提问!感谢所有多年来一直回答问题的仁慈用户:)
我最近一直在使用df.apply
,理想情况下想要将数据框传递到args
参数,看起来像这样: df.apply(testFunc, args=(dfOther), axis = 1)
我的最终目标是迭代我在args
参数中传递的数据帧,并针对原始数据帧的每一行检查逻辑,比如说 df
,并从 dfOther
返回一些值}。所以说我有这样的功能:
def testFunc(row, dfOther):
for index, rowOther in dfOther.iterrows():
if row['A'] == rowOther[0] and row['B'] == rowOther[1]:
return dfOther.at[index, 'C']
df['OTHER'] = df.apply(testFunc, args=(dfOther), axis = 1)
我目前的理解是args
需要一个Series对象,所以如果我实际运行它,我们会收到以下错误:
ValueError: The truth value of a DataFrame is ambiguous.
Use a.empty, a.bool(), a.item(), a.any() or a.all().
然而,在我写testFunc
之前只传入一个数据帧之前,我实际上写了priorTestFunc
,看起来像这样......而且它有效!
def priorTestFunc(row, dfOne, dfTwo):
for index, rowOne in dfOne.iterrows():
if row['A'] == rowOne[0] and row['B'] == rowOne[1]:
return dfTwo.at[index, 'C']
df['OTHER'] = df.apply(testFunc, args=(dfOne, dfTwo), axis = 1)
令我沮丧的是,我一直养成这样写testFunc
的习惯,并且按照预期工作:
def testFunc(row, dfOther, _):
for index, rowOther in dfOther.iterrows():
if row['A'] == rowOther[0] and row['B'] == rowOther[1]:
return dfOther.at[index, 'C']
df['OTHER'] = df.apply(testFunc, args=(dfOther, _), axis = 1)
我真的很感激,如果有人能让我知道为什么会出现这种情况,也许我会倾向于错误,或者可能是解决这类问题的另一种选择!!
编辑:根据评论的要求:我的dfs通常如下所示..他们将有两个匹配的列,并将返回dfOther.at[index, column]
我考虑pd.concat([dfOther, df])
的值但是我会正在df
运行一个测试条件的算法,然后根据dfOther
上的特定值(也将更新)相应地更新它,我希望 df
相对整齐,而不是制作一个多索引并扔掉其中的所有内容。另外我知道df.iterrows
通常很慢,但这些数据帧最多只能容纳500行,所以目前可扩展性对我来说并不是一个大问题。
df
Out[10]:
A B C
0 foo bur 6000
1 foo bur 7000
2 foo bur 8000
3 bar kek 9000
4 bar kek 10000
5 bar kek 11000
dfOther
Out[12]:
A B C
0 foo bur 1000
1 foo bur 2000
2 foo bur 3000
3 bar kek 4000
4 bar kek 5000
5 bar kek 6000
答案 0 :(得分:3)
错误在这一行:
File "C:\Anaconda3\envs\p2\lib\site-packages\pandas\core\frame.py", line 4017, in apply
if kwds or args and not isinstance(func, np.ufunc):
此处,if kwds or args
正在检查传递给args
的{{1}}的长度是否大于0.这是检查迭代是否为空的常用方法:
apply
l = [] if l: print("l is not empty!") else: print("l is empty!")
l is empty!
l = [1] if l: print("l is not empty!") else: print("l is empty!")
如果您已将元组作为l is not empty!
传递给df.apply
,则它将返回True并且不会出现问题。但是,Python没有将(df)解释为元组:
args
它只是括号内的DataFrame /变量。当您输入type((df))
Out[39]: pandas.core.frame.DataFrame
:
if df
您收到相同的错误消息。但是,如果你使用逗号来表示它是一个元组,它可以正常工作:
if df:
print("df is not empty")
Traceback (most recent call last):
File "<ipython-input-40-c86da5a5f1ee>", line 1, in <module>
if df:
File "C:\Anaconda3\envs\p2\lib\site-packages\pandas\core\generic.py", line 887, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
因此,通过将逗号添加为singleton来为if (df, ):
print("tuple is not empty")
tuple is not empty
添加逗号可以解决问题。
args=(dfOther)