Python函数,该函数遍历相应的列列表

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

我有大量相应的列: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_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