我有很多相应的列: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
答案 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