Python函数,该函数遍历相应的列列表
我有大量相应的列:colA1、colA2。。。colA60和colB1,colB2。。。colB60。 基于colA1和colB1的值,我想创建colC1。 如何为colAi、colBi和colCi创建一个在1到3范围内迭代I的函数?实际上,范围要大得多 我已经创建了一个列名列表:Python函数,该函数遍历相应的列列表,python,pandas,Python,Pandas,我有大量相应的列:colA1、colA2。。。colA60和colB1,colB2。。。colB60。 基于colA1和colB1的值,我想创建colC1。 如何为colAi、colBi和colCi创建一个在1到3范围内迭代I的函数?实际上,范围要大得多 我已经创建了一个列名列表: range_list= list(range(1,4)) for i in range(0, len(range_list)): range_list[i] = str(range_list[i]) A
range_list= list(range(1,4))
for i in range(0, len(range_list)):
range_list[i] = str(range_list[i])
A_list= ['colA' + s for s in range_list]
B_list= ['colB' + s for s in range_list]
C_list= ['colC' + s for s in range_list]
一些样本数据:
my_dict = {'colA1':[2,6,8,28,5],
'colA2': [38,6,14,63,3],
'colA3':[90,40,80,98,3],
'colB1':[1,46,23,4,42],
'colB2': [24,3,9,10,24],
'colB3':[35,12,19,3,23]}
df = pd.DataFrame(my_dict)
如何遍历函数中的这些对应列?
这是我的尝试,根本不起作用
def test_fx(x):
for a in range(len(A_list)) and b in range(len(B_list)):
c == df[a]
if df[b] >= 10:
c = df[a]*2
elif [b] >= 20:
c = df[a]*3
elif [b] >= 30:
c = df[a]*4
return c
for c in range(len(C_list)):
df[c] = 'empty'
df[c].apply(test_fx)
预期输出为添加到df的三列:
colC1:2,24,24,28,20
colC2:114,6,14126,9
colC3:360,80160,98,9据我所知,如果您希望同时遍历所有列,则可以使用ItErrors: 对于索引,行df.iterrows: 印刷索引 打印行 如果只想打印或执行其他操作,请执行以下操作: 对于索引,df.iterrows中的行: 打印行['colA1'],行['colA2']
阅读更多关于.iterrows的信息。我在你发布的行中看到的问题与你的申请有关。您从不指定要应用函数测试的df列 如果要从数据帧中的现有列a创建新列c,基本语法为:
df[c] = df[a].apply(func)
在您的情况下,对于所需输出的错误,我理解您希望将“text_fx”函数应用于每对列colAx、colBx,以在同一数据帧中输出一个colCx
在这种情况下,以下代码应该可以工作
import numpy as np
# get your column names
range_list= list(range(1,4))
list_A = ['colA' + str(s) for s in range_list]
list_B = ['colB' + str(s) for s in range_list]
list_C = ['colC' + str(s) for s in range_list]
#your self-defined function
#note that it takes a tuple as input
def test_fx(l):
a,b=l
q= a
if b >= 30:
q=a*4
elif b >= 20:
q = a*3
elif b >= 40:
q = a*2
else:
q=np.nan
return q
#iterate over each couple of colAi, colBi and put the result in colCi
for i in range(0, len(range_list)):
a = list_A[i] #next colA name
b = list_B[i] #next colB name
c = list_C[i]
df[c] = df[[a, b]].apply(test_fx, axis =1)
print(df)
请注意,与CenturionNOR的答案中的.iterrows一样,语法df[[a,b]]也返回一个元组。有关详细信息,请参见如果您想遍历列,可以尝试以下操作:
range_start=1
range_stop=3
for i in range(range_start,range_stop+1):
b_col="colB"+str(i)
a_col="colA"+str(i)
case_1=df.loc[(df[b_col]>= 10) & (df[b_col]< 20),a_col]*2
case_2=df.loc[(df[b_col]>= 20) & (df[b_col]< 30),a_col]*3
case_3 = df.loc[(df[b_col]>= 30) ,a_col]*4
df["C"+str(i)]=pd.concat([case_1,case_2,case_3])
NaN值用于不在范围内的B列的值。发布几行数据和所需输出在此输出中,colC2缺失,colC3填充为None。您是对的。我对它进行了编辑,将None改为真实的Nan。当我运行它的时候,我没有colC2丢失。另外,我在您发布的第一个函数上创建了函数test_fx。您可以轻松地修改函数中的值,我将其制作成与您的用例非常相似的样子。我会修改它。哦,第一次尝试的坏拷贝粘贴,C2列现在神奇地出现了
colA1 colA2 colA3 colB1 colB2 colB3 C1 C2 C3
0 2 38 90 1 24 35 NaN 114.0 360.0
1 6 6 40 46 3 12 24.0 NaN 80.0
2 8 14 80 23 9 19 24.0 NaN 160.0
3 28 63 98 4 10 3 NaN 126.0 NaN
4 5 3 3 42 24 23 20.0 9.0 9.0