簡體   English   中英

遍歷pandas列並在每次迭代中計算新列

[英]Iterating over pandas columns and calculating new columns in each iteration

我有一個看起來像這樣的數據框

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

實現這一目標的最簡單方法是什么?

您有兩個問題。

第一,也許你沒有意識到這一點。 您的數據數據類型是字符串。 我們首先需要轉換為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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM