如何从pandas数据框中的多个列创建多个列

时间:2015-02-08 19:28:42

标签: python pandas unpack

我正在建立一个干净的,非硬编码的存储库(=不使用里面的数据框列名称)功能模板,可以创建4种类型的功能:1个现有1个新列,1个现有1个新列, 1个新专栏,最后是多对多。

前三个看起来像这样并且工作:

In [97]:
data={'level1':[20,19,20,21,25,29,30,31,30,29,31],
      'level2': [10,10,20,20,20,10,10,20,20,10,10]}
index= pd.date_range('12/1/2014', periods=11)
frame=DataFrame(data, index=index)

In [98]:
def nonhardcoded_1to1(x):
    y=x+2
    return y
frame['test1to1']=frame['level1'].map(nonhardcoded_1to1)#works

def nonhardcoded_2to1(x,y):
    z=x+y
    return z
frame['test2to1']=frame[['level1','level2']].apply(lambda s: nonhardcoded_2to1(*s), axis=1)#works

def nonhardcoded_1to2(x):
    y=x+12
    z=x-12
    return y, z
frame['test1to2a'], frame['test1to2b'] = zip(*frame['level1'].map(nonhardcoded_1to2))#works

现在,对于多对多功能,我会遇到错误。我试图从上面的' 2to1'和' 1-2'功能,但他们不能一起工作:

def nonhardcoded_2to2(x,y):
    z1=x+y
    z2=x-y
    return z1, z2
frame['test2to2a'], frame['test2to2b']=zip(*frame[['level1','level2']].apply(lambda s: nonhardcoded_2to2(*s), axis=1))

ValueError: too many values to unpack

所以我试着深入研究函数调用:

test=frame[['level1','level2']].apply(lambda s: nonhardcoded_2to2(*s), axis=1)

返回了这个,所以从理论上讲这至少看起来很有用:

Out[104]:
level1  level2
2014-12-01  30  10
2014-12-02  29  9
2014-12-03  40  0
2014-12-04  41  1
2014-12-05  45  5
2014-12-06  39  19
2014-12-07  40  20
2014-12-08  51  11
2014-12-09  50  10
2014-12-10  39  19
2014-12-11  41  21

然后我尝试了:

test=zip(*frame[['level1','level2']].apply(lambda s: nonhardcoded_2to2(*s), axis=1))
test

返回了一个元组序列。由于某种原因,它似乎采取结果的标题并将其变成对。不确定为什么

[('l', 'l'), ('e', 'e'), ('v', 'v'), ('e', 'e'), ('l', 'l'), ('1', '2')]

我该如何创建和调用此函数以使其有效?

0 个答案:

没有答案