在python中创建一个函数并将其应用于数据帧

时间:2018-03-08 19:02:54

标签: python pandas numpy

需要一些帮助来创建和调用函数..

当前代码:

Table1 = Table1.assign(Field3 = np.where(Table1.Field1.astype(str).str[0:5].isin(['CEQTY','LPCEQ']),
                                         Table1.Field2, 0)) 

潜在的功能?

def func(a,b):
   Table1 = Table1.assign(a = np.where(Table1.Field1.astype(str).str[0:5].isin([b]),
                                       Table1.Field2, 0)) 

调用函数?

Table1.apply(func,a,b)?

我重复这个过程100次,唯一改变的是'Field3'isin.中的参数 在创建函数时可能会因语法

而出现错误

2 个答案:

答案 0 :(得分:1)

考虑替换DataFrame.Apply,因为您没有对每个列或行运行独占操作,而是基于其他列的条件逻辑 Field1 Field2 列。此外,Dataframe.assign采用不带引号的名称,该名称不适用于传入字符串。

相反,运行一个简单的Python函数调用,逐个字符串地分配然后返回一个新的df。下面用随机数据进行演示,播种可重复性,有条件地产生 Fields3-5

import pandas as pd
import numpy as np

np.random.seed(55)    
Table1 = pd.DataFrame({'ID': [np.random.randint(15) for _ in range(50)],
                       'Field1': [np.random.choice(['CEQTY','LPCEQ','ABCDE','WVXYZ','12345'],1).item(0) 
                                  for _ in range(50)],
                       'Field2':  np.random.randn(50)*100
                       }, columns=['ID', 'Field1', 'Field2'])

def func(df):
    # ITERATE THROUGH LIST OF TUPLES (NEW COL AND LIST OF SEARCH ITEMS)
    for i in [('Field3',['CEQTY','LPCEQ']),
              ('Field4',['ABCDE','WVXYZ']),
              ('Field5',['12345'])]:

        # ASSIGN NEW COL, i[0], BY STRING BASED ON SEARCH LIST, i[1]
        df[i[0]] = np.where(df.Field1.astype(str).str[0:5].isin(i[1]), df.Field2, 0) 

    return df

output = func(Table1)    
print(output.head(10))
#    ID Field1      Field2      Field3      Field4     Field5
# 0  13  LPCEQ  105.640854  105.640854    0.000000   0.000000
# 1  10  12345  -13.049038    0.000000    0.000000 -13.049038
# 2   7  CEQTY  -85.079280  -85.079280    0.000000   0.000000
# 3   8  12345   12.047304    0.000000    0.000000  12.047304
# 4  13  12345  -29.095108    0.000000    0.000000 -29.095108
# 5  13  12345  -24.229704    0.000000    0.000000 -24.229704
# 6  13  LPCEQ  -97.472869  -97.472869    0.000000   0.000000
# 7   5  ABCDE -221.743951    0.000000 -221.743951   0.000000
# 8   7  LPCEQ   -0.155842   -0.155842    0.000000   0.000000
# 9   5  CEQTY    2.297829    2.297829    0.000000   0.000000

答案 1 :(得分:0)

您很可能会收到语法错误,因为您没有使用正确的语法调用func

使用此:

Table1.apply(func(a, b))

调用函数时,需要在提供的参数周围使用括号。