我有一个包含3列a、b和c的数据框,还有一个接受3个参数的函数,例如一个小示例:
data_test = [[1,11,101],[2,12,102],[3,13,103],[4,14,104],[5,15,105],[6,16,106]]
df_test = pd.DataFrame(data_test,columns=['a','b','c'],dtype=float)
a b c
0 1.0 11.0 101.0
1 2.0 12.0 102.0
2 3.0 13.0 103.0
3 4.0 14.0 104.0
4 5.0 15.0 105.0
5 6.0 16.0 106.0
def my_function(a,b,c):
#changes a b and c and returns
x = a*10
y = b-20
z = a*b -7
return [x,y,z]
对于每一行,我希望应用函数并在新的数据帧中返回值a、b、c、x、y、z
我做到了:
df_wanted = pd.DataFrame( df_test.apply(lambda row: my_function(row['a'], row['b'], row['c']), axis=1) )
它正在返回:
0
0 [10.0, -9.0, 4.0]
1 [20.0, -8.0, 17.0]
2 [30.0, -7.0, 32.0]
3 [40.0, -6.0, 49.0]
4 [50.0, -5.0, 68.0]
5 [60.0, -4.0, 89.0]
如何获得如下结果,而不是每一行的数组:
a b c x y z
0 1.0 11.0 101.0 10.0 -9.0 4.0
1 2.0 12.0 102.0 20.0 -8.0 17.0
2 3.0 13.0 103.0 30.0 -7.0 32.0
3 4.0 14.0 104.0 40.0 -6.0 49.0
4 5.0 15.0 105.0 50.0 -5.0 68.0
5 6.0 16.0 106.0 60.0 -4.0 89.0
您可以返回熊猫系列而不是数组:
def my_function2(a,b,c):
#changes a b and c and returns
x = a*10
y = b-20
z = a*b -7
return pd.Series({
'x': x,
'y': y,
'z': z
})
df_wanted = pd.concat([
df_test,
df_test.apply(lambda row: my_function2(row['a'], row['b'], row['c']), axis=1)
], axis=1)
我知道您示例中的函数可能很简单,但请尝试使用向量化函数对列而不是逐行进行操作。它的效率要高得多。
修正你的代码
df=df_test.join( pd.DataFrame( df_test.apply(lambda row: my_function(row['a'], row['b'], row['c']), axis=1).tolist() ,columns=list('xyz')))
怎么办? **添加详细示例如下***
问题内容: 我有一个带有timeindex和3列的数据帧,其中包含3D矢量的坐标: 我想对也返回向量的每一行应用转换 但是如果我这样做: 我最后得到了一个以元组为元素的熊猫系列。这是因为apply将在不解压的情况下获取myfunc的结果。如何更改myfunc,以便获得具有3列的新df? 编辑: 以下所有解决方案均有效。Series解决方案确实允许使用列名,而List解决方案的执行速度似乎更快。 问
我有数据,其中因子标签已提供在单独的文件。因此,当我读到里面的东西时,我得到的数据如下所示: 和包含factor_x标签的单独数据帧,如下所示: 我正在寻找一种有效的方法来更新数据帧'data'中的factor_x_labels'中的标签。 我一直试图使用forcats包中的fct_recode或dplyr中的recode,但遇到了麻烦,因为(例如)现有的和更新的标签需要作为字符串粘贴,但需要用=
问题内容: 我在IPython中具有以下数据框,其中每一行都是一只股票: 我想应用一个groupby操作,该操作计算“ yearmonth”列中每个日期的所有内容的上限加权平均回报。 这按预期工作: 但是,然后我想将这些值“广播”回原始数据帧中的索引,并将它们保存为日期匹配的常量列。 我意识到这种天真的任务不起作用。但是,将groupby操作的结果分配给父数据帧上新列的“正确” Pandas习惯用
有谁能帮上忙吗?
我想使用返回元组的函数将两列添加到数据帧