需要一些帮助来创建和调用函数..
当前代码:
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.
中的参数
在创建函数时可能会因语法
答案 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))
调用函数时,需要在提供的参数周围使用括号。