遍历相应的Pandas列列表的Python函数

时间:2019-06-18 09:21:15

标签: 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_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,14,126,9
colC3:360,80,160,98,9

3 个答案:

答案 0 :(得分:2)

我在您发布的行中看到的问题与您的申请有关。您永远不会指定要在其上应用功能test_fx的df列。

如果要从数据框中的现有列a创建新列c的基本语法是:

df[c] = df[a].apply(func)

对于您的情况,对于所需输出的错误,我了解到您想对每对colAx,colBx列应用“ text_fx”函数,以在同一数据帧中输出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]]也返回一个元组。 this answer

中的更多详细信息

答案 1 :(得分:2)

如果要遍历列,可以尝试以下操作:

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])

使用这种方法,我一次创建一个Ci列: 我用Bi列中的值对Ai列进行子集化(这里为您的示例的3种情况提供3个子集),然后将结果连接到一个系列中,这就是我的Ci列。

df的输出将是:

   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

NaN值用于不属于该范围的B列的值。

答案 2 :(得分:1)

据我所知,您想同时遍历所有列,然后可以使用遍历:

for index, row df.iterrows():
    print(index)
    print(row)

如果您只想打印(或执行其他操作)某些列:

for index, row in df.iterrows():
    print(row['colA1'], row['colA2'])

详细了解.iterrows()here