使用带有两个参数的函数从两个现有列创建两个新列

时间:2018-05-18 08:17:20

标签: python pandas dataframe

我有类似这样的问题,但这个答案无法解决我的问题 Pandas: create two new columns in a dataframe with values calculated from a pre-existing column。 我有一个函数,它接受两个参数并在float中返回两个不同的值。原始数据帧也在float

def FunctionName (a, b):
   some calculations---
   return x, y

我有df,我想使用函数FunctionName,这样我将从现有的df['A], df['B]

系列中获得两个新系列
df['A], df['B]
df['A_new'], df['B_new'] = df[['A'], df['B']].apply(FunctionName)

给我一​​个错误

TypeError: unhashable type: 'list'

我也试过了 df['A_new'], df['B_new'] = FunctionName ( df['A'], df['B'])给了我一个错误

TypeError: cannot convert the series to <class 'float'>

我想将返回X值用于df['A_new'],将Y值用于df['B_new']

有人可以告诉我,我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

我认为需要参数axis=1apply对于具有lambda函数的行的进程来定义列bynames并为新列返回Series - 由join添加:

df = pd.DataFrame({'A':[4,5,4,5,5,4],
                   'B':[7,8,9,4,2,3],
                   'C':[1,3,5,7,1,0]})

print (df)
   A  B  C
0  4  7  1
1  5  8  3
2  4  9  5
3  5  4  7
4  5  2  1
5  4  3  0

def FunctionName (a, b):
   x = a * 5
   y = b * 7
   return pd.Series([x, y], index=['A_new','B_new'])

df = df.join(df.apply(lambda x: FunctionName(x['A'], x['B']), axis=1))
print (df)
   A  B  C  A_new  B_new
0  4  7  1     20     49
1  5  8  3     25     56
2  4  9  5     20     63
3  5  4  7     25     28
4  5  2  1     25     14
5  4  3  0     20     21
def FunctionName (a, b):
   x = a * 5
   y = b * 7
   return pd.Series([x, y])

df[['A_new', 'B_new']] = df.apply(lambda x: FunctionName(x['A'], x['B']), axis=1)
print (df)
   A  B  C  A_new  B_new
0  4  7  1     20     49
1  5  8  3     25     56
2  4  9  5     20     63
3  5  4  7     25     28
4  5  2  1     25     14
5  4  3  0     20     21