我有一個 DataFrame 并希望得到如下所示的列對的劃分:
df = pd.DataFrame({
'a1': np.random.randint(1, 1000, 1000),
'a2': np.random.randint(1, 1000, 1000),
'b1': np.random.randint(1, 1000, 1000),
'b2': np.random.randint(1, 1000, 1000),
'c1': np.random.randint(1, 1000, 1000),
'c2': np.random.randint(1, 1000, 1000),
})
df['a'] = df['a2'] / df['a1']
df['b'] = df['b2'] / df['b1']
df['c'] = df['c2'] / df['c1']
我想將最后三行合并為一行,例如:
df[['a', 'b', 'c']] = df[['a2', 'b2', 'c2']] / df[['a1', 'b1', 'c1']]
但我只得到一個錯誤ValueError: Columns must be same length as key。如果我只是簡單地print(df[['a2', 'b2', 'c2']] / df[['a1', 'b1', 'c1']]),我只會得到一個NaN形狀為 (1000, 6)的 DataFrame 。
uj5u.com熱心網友回復:
您可以使用:
df[['a', 'b', 'c']] = df[['a2', 'b2', 'c2']].values / df[['a1', 'b1', 'c1']].values
OUTPUT
a1 a2 b1 b2 c1 c2 a b c
0 864 214 551 761 174 111 0.247685 1.381125 0.637931
1 820 971 379 79 190 587 1.184146 0.208443 3.089474
2 305 154 519 378 567 186 0.504918 0.728324 0.328042
3 51 505 303 417 959 326 9.901961 1.376238 0.339937
4 84 531 625 899 248 905 6.321429 1.438400 3.649194
.. ... ... ... ... ... ... ... ... ...
995 302 695 790 777 896 975 2.301325 0.983544 1.088170
996 24 308 462 316 388 784 12.833333 0.683983 2.020619
997 135 286 359 752 282 283 2.118519 2.094708 1.003546
998 695 45 832 936 811 404 0.064748 1.125000 0.498150
999 809 454 971 335 366 884 0.561187 0.345005 2.415301
uj5u.com熱心網友回復:
您可以執行以下簡單的解決方法:
df['a'], df['b'], df['c'] = (df['a2'] / df['a1'], df['b2'] / df['b1'], df['c2'] / df['c1'])
雖然我認為使用該assign方法會使您的代碼更具可讀性:
df.assign(a=lambda x: x['a2'] / x['a1'],
b=lambda x: x['b2'] / x['b1'],
c=lambda x: x['c2'] / x['c1'])
uj5u.com熱心網友回復:
MultiIndex 在這里派上用場,因為 Pandas 在任何計算之前總是首先在索引上對齊(列也是一個索引)。
使用以下示例資料:
df = pd.DataFrame({'a_1':range(2,10,2),
'a_2': range(4, 20, 4),
'b_1': range(3, 15,3),
'b_2': range(6,30,6),
'c_1': range(5, 25, 5),
'c_2': range(10, 50, 10)})
df
a_1 a_2 b_1 b_2 c_1 c_2
0 2 4 3 6 5 10
1 4 8 6 12 10 20
2 6 12 9 18 15 30
3 8 16 12 24 20 40
將列拆分為 MultiIndex:
temp = df.copy()
temp.columns = temp.columns.str.split('_', expand = True).swaplevel()
temp
1 2 1 2 1 2
a a b b c c
0 2 4 3 6 5 10
1 4 8 6 12 10 20
2 6 12 9 18 15 30
3 8 16 12 24 20 40
在這種形式中,您可以簡單地選擇2除以1:
df['a','b','c']] = temp['2'] / temp['1']
這給出了與以下相同的值:
df[['a_2', 'b_2', 'c_2']].values / df[['a_1', 'b_1', 'c_1']].values
然而,想象一下,如果你有很多列,你不需要擔心配對,因為 MultiIndex 表單會照顧到這一點,Pandas 在計算之前進行對齊。
Numpy 會更快 - @MuhammadHassan 的回答很合適;這只是為了展示 MultiIndex 如何在正確的情況下占有一席之地及其用途。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/387636.html
