繁体   English   中英

熊猫:Apply():返回多个值

[英]Pandas: Apply(): Return more than one value

我的数据基于年份,以年份为索引。 我有someFunc()在groupedBy数据上做一些事情。 但是,它将返回两个值(两个浮点数,而不是列)。 我想将这两个值放入旧数据框中的两个新列中。 使用一个简单的函数进行演示,我想到的是

def someFunc(group):
    a = 1
    b = 2
    return pd.DataFrame([[a, b]], columns={'colA', 'colB'}, index=[group['year'][0]])
results = df.groupby(level=0).apply(someFunc)
pd.merge(df, results, left_index=True, right_index=True)

但是,这将创建一个双索引值:一个是因为我添加了一个索引,另一个是来自apply()的索引:

results
                colA        colB
year                            
1961 1961          1           2
1962 1962          1           2
1963 1963          1           2

因此,合并当然是行不通的。 我尝试了其他各种方式(包括返回numpy数组),但是它们都不是整齐的。 我该怎么办? 我知道我可以将函数拆分为两次,每次运行一次,以运行代码-但这并不是很有效。 需要明确的是,我的预期结果(对于可变结果)是

results
                colA        colB
year                            
1961               1           2
1962               1           2
1963               1           2

在此之前,数据看起来像

           c      a        b  
year                                                                          
1983     722   1001  1.06300  
1984     722   1001  1.24225   
1985     722   1001  2.78925   
1986     722   1001  0.59600   
1982  442110   1003  1.86300 

中间结果

return pd.DataFrame([[a, b]], columns=['colA', 'colB'], index=[group['year'].max()])

回报

           colA       colB
1961         30   2.434379

那么这就是关键问题,对吗? 它返回带有索引的内容,然后apply()在顶部堆叠其自己的索引。 由于没有办法返回没有索引的数据帧,我想解决方案必须在于影响apply()

如评论中所发表的:

results = df.groupby(level=0).apply(someFunc).reset_index(level=0, drop=True)

使用您的数据对我有用

In [57]:

temp="""year           c      a        b                                                                
1983     722   1001  1.06300  
1984     722   1001  1.24225   
1985     722   1001  2.78925   
1986     722   1001  0.59600   
1982  442110   1003  1.86300 """

df = pd.read_csv(io.StringIO(temp), sep='\s+')
df
Out[57]:
   year       c     a        b
0  1983     722  1001  1.06300
1  1984     722  1001  1.24225
2  1985     722  1001  2.78925
3  1986     722  1001  0.59600
4  1982  442110  1003  1.86300

[5 rows x 4 columns]
In [66]:

def someFunc(group):
    a = 1
    b = 2
    #print(group['year'].values)
    return pd.DataFrame([[a, b]], columns={'colA', 'colB'}, index=[group['year'].max()])
df.groupby(level=0).apply(someFunc)
Out[66]:
        colA  colB
0 1983     1     2
1 1984     1     2
2 1985     1     2
3 1986     1     2
4 1982     1     2

[5 rows x 2 columns]

编辑

经过进一步的讨论,以上代码还显示了您面临的重复索引,因此您可以调用reset_index来消除重复项:

In [91]:

def someFunc(group):
    a = 1
    b = 2
    return pd.DataFrame([[a, b]], columns={'colA', 'colB'}, index=[group['year'].max()])
df.groupby(level=0).apply(someFunc).reset_index(level=0, drop=True)

Out[91]:
      colA  colB
1983     1     2
1984     1     2
1985     1     2
1986     1     2
1982     1     2

[5 rows x 2 columns]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM