A B C D E ... Z
date
1 100 200 105 90 110 ... 100
2 105 195 110 100 115 ...120
3 120 210 120 90 120 ... 105
4 150 150 100 110 140 ... 140
5 100 140 150 100 130 ... 160
このようなdfがあったとして、全ての列同士の組み合わせで引算(A-A,A-B,A-C…,B-A,B-B…,Z-Zみないな)をする場合、Pythonを使用してプログラミングする場合どのようにしたら良いでしょか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/13 10:50
回答3件
0
python
1import pandas as pd 2import numpy as np 3from numpy.random import default_rng 4from string import ascii_uppercase 5 6# dataframe for testing 7rg = default_rng() 8nrow, ncol = 5, len(ascii_uppercase) 9df = pd.DataFrame(rg.integers(50, 300, (nrow, ncol)), columns=[*ascii_uppercase]) 10 11# permutation 12v = df.values 13i = np.arange(ncol).repeat(ncol-1) 14j = np.tile(np.arange(ncol), (ncol, 1))[~np.eye(ncol, dtype=bool)] 15dfx = pd.DataFrame(v[:, i]-v[:, j], df.index, [df.columns[i]+'-'+df.columns[j]]) 16 17print(df) 18print(dfx) 19 20# 21 A B C D E F G H ... S T U V W X Y Z 220 258 133 243 58 87 232 253 129 ... 114 81 195 79 150 275 231 204 231 153 157 166 253 286 195 263 220 ... 275 159 154 215 240 172 209 234 242 102 98 167 201 275 218 105 166 ... 203 112 60 123 62 234 281 228 253 145 209 160 73 127 103 239 225 ... 299 218 96 249 278 130 279 201 264 284 216 128 78 120 161 294 203 ... 171 216 161 154 287 62 200 264 27 28[5 rows x 26 columns] 29 30 A-B A-C A-D A-E A-F A-G A-H A-I A-J ... Z-Q Z-R Z-S Z-T Z-U Z-V Z-W Z-X Z-Y 310 125 15 200 171 26 5 129 71 157 ... 70 149 90 123 9 125 54 -71 -27 321 -4 -13 -100 -133 -42 -110 -67 -58 -49 ... 124 125 -41 75 80 19 -6 62 25 332 4 -65 -99 -173 -116 -3 -64 -127 -66 ... 49 -20 25 116 168 105 166 -6 -53 343 -64 -15 72 18 42 -94 -80 -72 4 ... 74 -78 -98 -17 105 -48 -77 71 -78 354 68 156 206 164 123 -10 81 47 36 ... 23 69 93 48 103 110 -23 202 64 36 37[5 rows x 650 columns]
投稿2021/12/13 18:27
総合スコア20655
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
python
1# A B C D E 2#0 100 200 105 90 110 3#1 105 195 110 100 115 4#2 120 210 120 90 120 5#3 150 150 100 110 140 6#4 100 140 150 100 130 7 8df2 = pd.concat({str(i)+'-'+str(j):df[i] - df[j] for i in df.columns for j in df.columns}, axis=1) 9print(df2) 10# A-A A-B A-C A-D A-E B-A B-B B-C B-D B-E ... 11#0 0 -100 -5 10 -10 100 0 95 110 90 ... 12#1 0 -90 -5 5 -10 90 0 85 95 80 ... 13#2 0 -90 0 30 0 90 0 90 120 90 ... 14#3 0 0 50 40 10 0 0 50 40 10 ... 15#4 0 -40 -50 0 -30 40 0 -10 40 10 ...
投稿2021/12/13 13:30
総合スコア10760
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
使い道があるとは思えませんが、あたまの体操として解いてみました。
python
1>>> import pandas as pd 2>>> import numpy as np 3>>> df = pd.DataFrame(np.random.randint(1,100, (10,26)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')) 4>>> print(df) 5 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 60 73 44 88 87 35 92 56 77 29 93 91 19 72 45 98 76 3 74 75 43 40 89 68 15 47 56 71 96 82 26 55 42 78 15 49 44 61 93 21 98 98 36 13 50 60 7 43 98 53 55 99 46 12 82 49 15 54 57 20 38 2 62 67 46 29 68 70 45 3 75 72 35 77 84 84 64 37 60 13 69 93 95 77 62 89 45 59 59 94 73 16 65 71 10 87 1 87 82 5 22 25 65 43 3 86 10 65 104 26 56 11 7 42 67 36 73 40 87 6 61 79 11 57 20 37 38 92 41 94 26 99 59 71 90 115 52 21 6 10 11 26 14 22 19 71 30 79 3 36 11 25 38 61 45 22 8 13 67 57 20 3 126 50 89 89 66 90 95 41 16 11 91 97 32 57 11 65 41 67 74 47 93 22 26 57 23 19 14 137 68 26 58 34 85 72 28 51 60 86 1 69 15 74 1 23 2 32 88 19 89 46 34 44 7 64 148 50 54 63 91 64 67 99 48 94 64 97 52 96 7 13 91 96 3 78 94 21 95 31 23 55 23 159 2 47 6 26 79 54 82 58 24 33 98 42 5 42 90 87 2 75 64 92 11 81 56 78 67 63 16>>> df1 = df.T.reset_index() 17>>> df2 = pd.merge(df1, df1, how='cross') 18>>> df2.index = df2['index_x'] + '-' + df2['index_y'] 19>>> df3 = df2.iloc[:, 1:len(df)+1].T.reset_index(drop=True) - df2.iloc[:, len(df)+2:].T.reset_index(drop=True) 20>>> df3.drop([c + '-' + c for c in df.columns], axis=1, inplace=True) 21>>> print(df3) 22 A-B A-C A-D A-E A-F A-G A-H A-I A-J A-K A-L ... Z-O Z-P Z-Q Z-R Z-S Z-T Z-U Z-V Z-W Z-X Z-Y 230 29 -15 -14 38 -19 17 -4 44 -20 -18 54 ... -42 -20 53 -18 -19 13 16 -33 -12 41 9 241 14 70 41 54 18 81 47 52 35 3 75 ... -24 -1 -38 -48 5 -31 -86 -41 -43 -87 -34 252 34 -5 -8 29 11 47 -13 -18 3 20 -19 ... 66 -6 -3 34 -8 -15 -15 5 32 9 56 263 18 33 6 50 36 36a 1 22 79 30 24 ... 64 -22 -17 60 43 40 0 22 62 -21 55 274 -30 15 19 -16 -41 -10 -47 -14 -61 20 -35 ... 33 70 53 52 -2 49 -4 64 -9 31 19 285 31 46 42 41 26 38 30 33 -19 22 -27 ... -8 -22 -35 -58 -42 -19 -5 -10 -64 -54 -17 296 -39 -39 -16 -40 -45 9 34 39 -41 -47 18 ... -51 -27 -53 -60 -33 -79 -8 -12 -43 -9 -5 307 42 10 34 -17 -4 40 17 8 -18 67 -1 ... 63 41 62 32 -24 45 -25 18 30 20 57 318 -4 -13 -41 -14 -17 -49 2 -44 -14 -47 -2 ... 10 -68 -73 20 -55 -71 2 -72 -8 0 -32 329 -45 -4 -24 -77 -52 -80 -56 -22 -31 -96 -40 ... -27 -24 61 -12 -1 -29 52 -18 7 -15 -4 33 34[10 rows x 650 columns]
投稿2021/12/13 12:08
総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。