根据pandas + iteration中其他列的值创建列

时间:2017-06-23 11:31:52

标签: pandas

假设我有数据框。

另外我有2个列表:

se_bench = []
tu_bench= []

我想创建像:

这样的函数
def calculation(row):
    if row['var_1'] == #something:
        return (se_bench[1]/tu_bench[1])* turnover.iloc[i,]

    elif row['var_1'] == #something else:
        return (se_bench[2]/tu_bench[2])* turnover.iloc[i,]

df.apply(lambda row: calculation(row),axis = 1)

其中'var_1'和'营业额'是数据框中的变量。 如何在每行中迭代turnover.iloc[i,]

我认为,可以通过for循环来实现,但是可以使用apply函数吗?

修改

使用for循环它的工作原理如下:

#Or alternative:
se = []
for i in range(len(df.index)):
    if df['var_1'] == #something:
        seva.append((se_bench[1]/tu_bench[1])* turnover.iloc[i,])

    elif row['var_1'] == #something else:
        seva.append((se_bench[1]/tu_bench[1])* turnover.iloc[i,])

    else:
        seva.append(np.nan)


df['seva'] = pd.Series(seva,index = df.index)

2 个答案:

答案 0 :(得分:0)

您可以使用df.applymap()函数将函数应用于整个数据帧,并且比编写遍历行的循环更有效。

df.applymap(lambda x: calculation(x))

应该适用于您的情况。

答案 1 :(得分:0)

def calculation(row):
    if row['var_1'] == #something:
        return (se_bench[1]/tu_bench[1])* row['turnover']

    elif row['var_1'] == #something else:
        return (se_bench[2]/tu_bench[2])* row['turnover']

    else:
         return (np.nan)    

df['seva'] = df.apply(calculation, axis = 1)