我有以下数据框:
a b c d e f g h i j
1 2 3 4 5 6 7 8 0.1 0.11
11 12 13 14 15 16 17 18 0.2 0.12
21 22 23 24 25 26 27 28 0.3 0.13
31 32 33 34 35 36 37 38 0.4 0.14
我想读取EACH ROW,对于a到h列中的每个值(在该行中),减去i列中的值并除以j列中的值,然后用该结果值替换该原始值,并更新整个数据框(从a到h列)。
在这种情况下我应该如何进行?
答案 0 :(得分:4)
您可以使用整形列i
和j
并减去,
df = df.iloc[:, :8].sub(df['i'].values[:, None]).div(df['j'].values[:, None]).round(2)
a b c d e f g h
0 8.18 17.27 26.36 35.45 44.55 53.64 62.73 71.82
1 90.00 98.33 106.67 115.00 123.33 131.67 140.00 148.33
2 159.23 166.92 174.62 182.31 190.00 197.69 205.38 213.08
3 218.57 225.71 232.86 240.00 247.14 254.29 261.43 268.57
答案 1 :(得分:3)
使用filter
和基础numpy
数组。
u = df.filter(regex='[^ij]')
res = (u.values - df.i.values[:, None]) / df.j.values[:, None]
pd.DataFrame(res, columns=u.columns)
a b c d e f g h
0 8.181818 17.272727 26.363636 35.454545 44.545455 53.636364 62.727273 71.818182
1 90.000000 98.333333 106.666667 115.000000 123.333333 131.666667 140.000000 148.333333
2 159.230769 166.923077 174.615385 182.307692 190.000000 197.692308 205.384615 213.076923
3 218.571429 225.714286 232.857143 240.000000 247.142857 254.285714 261.428571 268.571429
答案 2 :(得分:3)
尝试将sub
和div
用于索引切片:
df.loc[:, 'a':'h'] = df.loc[:, 'a':'h'].sub(df['i'], axis=0).div(df['j'], axis=0)
输出:
a b c d e f \
0 8.181818 17.272727 26.363636 35.454545 44.545455 53.636364
1 90.000000 98.333333 106.666667 115.000000 123.333333 131.666667
2 159.230769 166.923077 174.615385 182.307692 190.000000 197.692308
3 218.571429 225.714286 232.857143 240.000000 247.142857 254.285714
g h i j
0 62.727273 71.818182 0.1 0.11
1 140.000000 148.333333 0.2 0.12
2 205.384615 213.076923 0.3 0.13
3 261.428571 268.571429 0.4 0.14
答案 3 :(得分:2)
这应该在您实际使用8 + 2列的情况下有效:
for col in df.columns[:8]:
df[col]=(df[col]-df['i'])/df['h']
也许有一种更有效的方法,但这应该很容易理解
答案 4 :(得分:2)
有趣的方法eval
:-)
pd.concat([df.eval('('+x +'-i)'+'/j') for x in df.columns[:8]],axis=1,keys=df.columns[:8])
Out[88]:
a b c ... f g h
0 8.181818 17.272727 26.363636 ... 53.636364 62.727273 71.818182
1 90.000000 98.333333 106.666667 ... 131.666667 140.000000 148.333333
2 159.230769 166.923077 174.615385 ... 197.692308 205.384615 213.076923
3 218.571429 225.714286 232.857143 ... 254.285714 261.428571 268.571429
[4 rows x 8 columns]
答案 5 :(得分:1)
这直接在numpy数组上进行操作
onRegionChangeComplete