Python 使用函数从特定列输入返回多列输出

Python 使用函数从特定列输入返回多列输出,python,pandas,apply,Python,Pandas,Apply,我想通过应用一个函数将两个新列添加到我的数据框架中,该函数从多个特定的预先存在的列中获取输入 以下是我的方法,可以返回一列,但不能返回多列: 这是我的数据框: d = {'a': [3,0,2,2], 'b': [0,1,2,3], 'c': [1,1,2,3], 'd': [2,2,1,3]} df = pd.DataFrame(d) 我正在尝试应用此函数: def myfunc(a,b,c): if a > 2 and b > 2:

我想通过应用一个函数将两个新列添加到我的数据框架中,该函数从多个特定的预先存在的列中获取输入

以下是我的方法,可以返回一列,但不能返回多列:

这是我的数据框:

d = {'a': [3,0,2,2],
    'b': [0,1,2,3],
    'c': [1,1,2,3],
    'd': [2,2,1,3]}

df = pd.DataFrame(d)
我正在尝试应用此函数:

def myfunc(a,b,c):
    if a > 2 and b > 2:
        print('condition 1',a,b)
        return pd.Series((a,b))
    elif a < 2 and c < 2:
        print('condition 2',a,c)
        return pd.Series((b,c))
    else:
        print('no condition')
        return pd.Series((None,None))
输出:

no condition
no condition
condition 2 0 1
no condition
no condition
数据帧结果:


如何输入多个列并输出多个列?

当我的函数匹配时,您的函数将返回一个带有NAs或2元组的序列

解决此问题的一种方法是返回序列,该序列将由apply自动展开:

def myfunc(col1,col2,col3):
    if col1 == 'x' and col2 == 'y':
        return pd.Series((col1,col2))
    if col2 == 'a' and col3 == 'b':
        return pd.Series(('yes','no'))

请注意,双括号将一个参数作为元组传递。列表也可以。

问题在于分配,而不是myfunc

当您尝试将数据帧解包为元组时,它将返回列标签。这就是为什么你得到0,1的一切

df['e'], df['f'] = pd.DataFrame([[8, 9]] * 1000000, columns=['Told', 'You'])
print(df)

   a  b  c  d     e    f
0  3  0  1  2  Told  You
1  0  1  1  2  Told  You
2  2  2  2  1  Told  You
3  2  3  3  3  Told  You
使用连接

或是康卡特警长

两者都给予

   a  b  c  d    e    f
0  3  0  1  2  NaN  NaN
1  0  1  1  2  1.0  1.0
2  2  2  2  1  NaN  NaN
3  2  3  3  3  NaN  NaN

谢谢Boud,当我以系列或列表的形式返回时,我仍然会得到相同的值错误。那么你做错了什么,或者你在问题中描述的问题和df不是你的真实情况,你还有另一个问题Boud,我编辑了我的问题以使其更清楚。如果你能看到我做错了什么,那么请让我知道。有趣的是,我一开始考虑过,但当我测试它时,我得到了两个自然的NA列,然后我认为来自Pandashis的另一个魔法给了我奇怪的输出。如果其中一个条件为true,则它将使用该输出填充新列的所有值,而不是“无”。@sparrow您必须使用实际使用的数据进行更新,这似乎对我有效。另外,请注意,我没有在那里。但是熊猫会成功的NaN@piRSquared,谢谢,我已经用我的实际数据更新了。@sparrow whew。。。我想我们现在明白了:-让我知道
df.join(df.apply(lambda x: myfunc(x['a'],x['b'],x['c']),axis=1))
pd.concat([df, df.apply(lambda x: myfunc(x['a'],x['b'],x['c']),axis=1)], axis=1)
   a  b  c  d    e    f
0  3  0  1  2  NaN  NaN
1  0  1  1  2  1.0  1.0
2  2  2  2  1  NaN  NaN
3  2  3  3  3  NaN  NaN