遍历pandas列并在每次迭代中计算新列

时间:2018-08-29 00:50:52

标签: python pandas for-loop

我有一个看起来像这样的数据框

d = {'A': [10, 20, 30, 40], 'B': [20, 30, 40, 50],'C': [30, 40, 50, 60]}
df = pd.DataFrame(data=d)

    A        B       C
    10       20      30  
    20       30      40 
    30       40      50    
    40       50      60

我正在尝试构建一个循环,以使其使用复杂的公式创建三个新列(每个迭代中一个),其中只有一个增加10%,而其他两个在每次迭代中保持不变。

每次应用的公式为:sqrt((((A ** 2)* B)+((B ** 2)* C))

所以所需的输出是-

    A        B       C      X_A      X_B       X_C
    10       20      30     120.08   129.30    123.29
    20       30      40     224.77   238.24    227.16
    30       40      50     351.51   369.32    352.14
    40       50      60     496.79   519.13    494.98

最简单的方法是什么?

2 个答案:

答案 0 :(得分:4)

您有两个问题。

第一次,您可能没有意识到。 您的数据数据类型是字符串。 首先需要将其转换为int

df=df.astype(int)

然后我们使用divadd

pd.concat([df,df.div(10).add(df.sum(1),0).add_prefix('X_')],axis=1)
Out[1082]: 
    A   B   C  X_A  X_B  X_C
0  10  20  30   61   62   63
1  20  30  40   92   93   94
2  30  40  50  123  124  125
3  40  50  60  154  155  156

答案 1 :(得分:1)

eval

我们可以使用一些动态字符串插值和pandas.DataFrame.eval
需要Python 3.6

fbase = '(((({0:}) ** 2) * ({1:})) + ((({1:}) ** 2) * ({2:}))) ** .5'.format

df.eval(f"""\
X_A = {fbase('1.1 * A', 'B', 'C')}
X_B = {fbase('A', '1.1 * B', 'C')}
X_C = {fbase('A', 'B', '1.1 * C')}
""")

    A   B   C         X_A         X_B         X_C
0  10  20  30  120.083304  129.305839  123.288280
1  20  30  40  224.766546  238.243573  227.156334
2  30  40  50  351.511024  369.323706  352.136337
3  40  50  60  496.789694  519.133894  494.974747

动态性强,但不需要Python 3.6

df.eval("""\
X_A = ((((1.1 * A) ** 2) * (B)) + (((B) ** 2) * (C))) ** .5
X_B = '((((A) ** 2) * (1.1 * B)) + (((1.1 * B) ** 2) * (C))) ** .5'
X_C = ((((A) ** 2) * (B)) + (((B) ** 2) * (1.1 * C))) ** .5
""")

    A   B   C         X_A         X_B         X_C
0  10  20  30  120.083304  129.305839  123.288280
1  20  30  40  224.766546  238.243573  227.156334
2  30  40  50  351.511024  369.323706  352.136337
3  40  50  60  496.789694  519.133894  494.974747

脾气暴躁

def f(m):
  A, B, C = m.T
  return (((A ** 2) * B) + ((B ** 2) * C)) ** .5

v = df.values
m = np.eye(3) * .1 + np.ones((3, 3))

r = f((v * m[:, None]).reshape(-1, 3)).reshape(3, -1)

df.assign(**dict(zip('X_A X_B X_C'.split(), r)))

    A   B   C         X_A         X_B         X_C
0  10  20  30  120.083304  129.305839  123.288280
1  20  30  40  224.766546  238.243573  227.156334
2  30  40  50  351.511024  369.323706  352.136337
3  40  50  60  496.789694  519.133894  494.974747