[英]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)
然后我們使用div
並add
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.