python - 如何使用 Pandas 中数据框的两个参数从应用 lambda 的结果中返回列组成数据框
问题描述
我有一个包含 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)
我知道您示例中的函数可能很简单,但请尝试使用矢量化函数对列而不是逐行进行操作。它的效率要高得多。
推荐阅读
- c++ - 与实现无关的浮点/整数转换
- c# - 如何从字符串数据中检索 varbinary?
- javascript - 如何使用 vanilla js 和 sass 创建可重用的按钮组件?
- ios - 将数据从单元格中的按钮传递到另一个表格视图?
- windows - 无法通过 Jenkins 执行 bat 文件
- python-3.x - 如何使用 ffmpeg 将音频切割成重叠的片段?
- java - 将 maven pom.xml 从 java 8 升级到 13。如何在安装了 java 8 和 13 的机器上运行升级的 maven 项目
- javascript - 单击按钮后,消息出现在同一个 div 中
- solr - Windows 10 上的 solr 入门 - 我的第一个本地(非云)集合/核心
- java - 如何将整数传递给参数类型是整数数组而不是整数的实例