Python:将函数应用于Pandas DataFrame的每一行并返回**新数据框**

时间:2017-06-15 17:56:09

标签: python pandas dataframe

我正在尝试将函数应用于数据框的每一行。棘手的部分是该函数为每个已处理的行返回一个新的数据框。假设可以从处理的行中轻松导出此数据框的列。

最后,结果应该是所有这些数据框(每个已处理行1个)连接在一起。我故意不提供示例代码,因为最简单的解决方案提议会做,只要“狡猾的”'部分如果履行。

我花了好几个小时尝试挖掘文档和stackoverflow来寻找解决方案。像往常一样,除了最简单的操作之外,大熊猫文档是如此缺乏实际的例子,我无法弄明白。我也确保不会错过任何重复的问题。非常感谢。

3 个答案:

答案 0 :(得分:1)

目前还不清楚您要实现的目标,但我怀疑您需要创建单独的数据帧。

下面的示例显示了如何获取数据框,将其子集化到感兴趣的列,将函数foo应用于其中一列,然后应用返回多个值的第二个函数bar

df = pd.DataFrame({
    'first_name': ['john', 'nancy', 'jolly'],
    'last_name': ['smith', 'drew', 'rogers'],
    'A': [1, 4, 7],
    'B': [2, 5, 8],
    'C': [3, 6, 9]
})

>>> df
first_name  last_name   A   B   C
0   john    smith   1   2   3
1   nancy   drew    4   5   6
2   jolly   rogers  7   8   9

def foo(first_name):
    return 2 if first_name.startswith('j') else 1

def bar(first_name):
    return (2, 0) if first_name.startswith('j') else (1, 3)

columns_of_interest = ['first_name', 'A']

df_new = pd.concat([
    df[columns_of_interest].assign(x=df.first_name.apply(foo)),
    df.first_name.apply(bar).apply(pd.Series)], axis=1)

>>> df_new
first_name  A   x   0   1
0   john    1   2   2   0
1   nancy   4   1   1   3
2   jolly   7   2   2   0

答案 1 :(得分:0)

假设您要应用于每一行的功能称为if ($request->isPost()) { $files = $request->getFiles()->toArray(); $files = reset($files); $data = $request->getPost(); $docId = $data['documentId']; // get this from your frontend POST params $docCount = count($files); try { $endpoints = $this->getDocumentUploadUrls($userId, $docId, $docCount); $uploadInfo = $this->uploadDocuments($endpoints, $files); } catch (\Exception $e) { // handle exception } } public function uploadDocuments(Array $endpoints, Array $files) { $info = []; foreach ($files as $index => $file) { $url = $endpoints[$index]['url']; // the no. of files must match the number of endpoints for this to work $type = isset($file['type']) ? $file['type'] : 'application/octet-stream'; $headers = [ "Content-Type: $type", 'Access-Control-Allow-Origin: *', ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS, $file); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); if (curl_errno($ch)) { throw new \Exception(curl_error($ch)); } curl_close($ch); $info[] = [ 'headers' => $headers, 'response' => $response ]; } return $info; }

f

工作示例

pd.concat({i: f(row) for i, row in df.iterrows()})

或者

df = pd.DataFrame(np.arange(25).reshape(5, 5), columns=list('ABCDE'))

def f(row):
    return pd.concat([row] * 2, keys=['x', 'y']).unstack().drop('C', 1).assign(S=99)

pd.concat({i: f(row) for i, row in df.iterrows()})

      A   B   D   E   S
0 x   0   1   3   4  99
  y   0   1   3   4  99
1 x   5   6   8   9  99
  y   5   6   8   9  99
2 x  10  11  13  14  99
  y  10  11  13  14  99
3 x  15  16  18  19  99
  y  15  16  18  19  99
4 x  20  21  23  24  99
  y  20  21  23  24  99

答案 2 :(得分:0)

我会这样做 - 虽然我注意到.apply可能就是你想要的。

import pandas as pd
import numpy as np

np.random.seed(7)

orig=pd.DataFrame(np.random.rand(6,3))

orig.columns=(['F1','F2','F3'])

res=[]


for i,r in orig.iterrows():
    tot=0
    for col in r:
        tot=tot+col
    rv={'res':tot}
    a=pd.DataFrame.from_dict(rv,orient='index',dtype=np.float64)
    res.append(a)


res[0].head()

应该返回类似这样的内容

{'res':10}