[英]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.