如何在熊猫中做到这一点:
我在单个文本列上有一个函数 extract_text_features
,返回多个输出列 . 具体来说,该函数返回6个值 .
该函数有效,但似乎没有任何正确的返回类型(pandas DataFrame / numpy数组/ Python列表),以便输出可以正确分配 df.ix[: ,10:16] = df.textcol.map(extract_text_features)
所以我认为我需要回到 df.iterrows()
迭代,根据this?
更新:使用 df.iterrows()
进行迭代的速度至少要慢20倍,因此我将函数放弃并将函数拆分为六个不同的 .map(lambda ...)
调用 .
11 回答
Build 用户1827356的答案,你可以使用
df.merge
一次完成作业:我通常使用
zip
执行此操作:这就是我过去所做的
编辑完整性
对于95%的用例,这是实现此目的的正确和最简单的方法:
Summary: 如果您只想创建几列,请使用
df[['new_col1','new_col2']] = df[['data1','data2']].apply( function_of_your_choosing(x), axis=1)
对于此解决方案,您创建的新列的数量必须等于您用作.apply()函数输入的列数 . 如果您想做其他事情,请查看其他答案 .
Details 让's say you have two-column dataframe. The first column is a person'的高度为10;第二个是20岁时的人的身高 .
假设你需要计算每个人身高的平均值和每个人身高的总和 . 这是每行两个值 .
您可以通过以下即将应用的功能执行此操作:
你可能会像这样使用这个函数:
(要明确:此apply函数接受子集化数据框中每一行的值并返回一个列表 . )
但是,如果你这样做:
您将创建一个包含[mean,sum]列表的新列,您可能希望避免这些列,因为这需要另一个Lambda / Apply .
相反,您希望将每个值分解为自己的列 . 为此,您可以一次创建两列:
我看了几种方法,这里显示的方法(返回一个熊猫系列)似乎并不是最有效的 .
如果我们从一个庞大的随机数据数据框开始:
此处显示的示例:
另一种方法:
通过我的计算,采用一系列元组然后将其转换为DataFrame效率更高 . 如果我的工作中出现错误,我会有兴趣听到别人的想法 .
对于大量数据,接受的解决方案将非常缓慢 . 具有最多数量的upvotes的解决方案有点难以阅读,并且还因数字数据而变慢 . 如果每个新列可以独立于其他列计算,我只需直接分配它们而不使用
apply
.假字符数据示例
在DataFrame中创建100,000个字符串
假设我们想要在原始问题中提取一些文本特征 . 例如,让我们提取第一个字符,计算字母“e”的出现次数并将该短语大写 .
Timings
令人惊讶的是,您可以通过循环遍历每个值来获得更好的性能
假数字数据的另一个例子
创建100万个随机数并从上面测试
powers
函数 .分配每列快25倍且非常易读:
我用more details here做了类似的回答,为什么
apply
通常不是那种方式 .在2018年,我使用
apply()
与参数result_type='expand'
在其他两个类似问题中发布了相同的答案 . 我喜欢这样做的方法是将函数的返回值包装在一个系列中:
然后使用apply如下创建单独的列:
您可以返回整行而不是值:
函数返回行的位置
对我来说,这工作:
输入df
功能
创建2个新列:
输出: