我想將除第一列之外的所有列與資料框的特定列分開,并將結果添加為具有新標題的新列,但我被卡住了。這是我的方法,但請溫柔,我一個月前才開始編程..:
我得到了這個示例資料框:
np.random.seed(0)
data = pd.DataFrame(np.random.randint(1,10,size=(100, 10)),
columns=list('ABCDEFGHIJ'))
現在我創建一個列串列并洗掉“A”和“J”:
cols = list(data.drop(columns=['A', 'J']).columns)
然后我想將 BI 列除以 J 列。在這個例子中這很容易,因為只有單個字母,但實際上列名更長(例如“Donaudampfschifffahrtkapit?n”(真的很有趣而且很長的話用德語)。這就是為什么我想用“cols”串列來做。
data[[cols]] = data[[cols]].div(data['J'].values,axis=0)
但是,我收到此錯誤:
KeyError: "None of [Index([('B', 'C', 'D', 'E', 'F', 'G', 'H', 'I')], dtype='object')] are in the [columns]"
怎么了?或者有人知道更好的方法嗎?
以及如何將具有特定名稱('B/J'、'C/J'、...、'I/J')的結果添加到資料框中?
提前謝謝!
uj5u.com熱心網友回復:
您需要洗掉[], cols 已經是一個串列:
data[cols] = data[cols].div(data['J'], axis=0)
注意。也不需要using values,因為 pandas 執行索引對齊(無論如何您不會在此處更改行的順序)。
輸出:
A B C D E F G H I J
0 6 0.125000 0.500000 0.500000 1.000000 0.500000 0.750000 0.375000 0.625000 8
1 7 1.500000 1.500000 0.333333 1.166667 1.333333 1.333333 1.500000 0.333333 6
2 9 0.555556 0.444444 0.111111 0.444444 0.666667 0.111111 0.333333 0.444444 9
3 2 0.500000 0.500000 0.500000 1.000000 0.125000 0.250000 0.125000 0.625000 8
4 4 0.428571 1.142857 0.428571 0.142857 0.142857 0.714286 0.857143 0.857143 7
...
作為新列
data2 = pd.concat([data, data[cols].div(data['J'], axis=0).add_suffix('/J')],
axis=1)
輸出:
A B C D E F G H I J B/J C/J D/J E/J \
0 6 1 4 4 8 4 6 3 5 8 0.125000 0.500000 0.500000 1.000000
1 7 9 9 2 7 8 8 9 2 6 1.500000 1.500000 0.333333 1.166667
2 9 5 4 1 4 6 1 3 4 9 0.555556 0.444444 0.111111 0.444444
3 2 4 4 4 8 1 2 1 5 8 0.500000 0.500000 0.500000 1.000000
4 4 3 8 3 1 1 5 6 6 7 0.428571 1.142857 0.428571 0.142857
F/J G/J H/J I/J
0 0.500000 0.750000 0.375000 0.625000
1 1.333333 1.333333 1.500000 0.333333
2 0.666667 0.111111 0.333333 0.444444
3 0.125000 0.250000 0.125000 0.625000
4 0.142857 0.714286 0.857143 0.857143
uj5u.com熱心網友回復:
因為cols是串列洗掉嵌套[]:
data = pd.DataFrame(np.random.randint(1,10,size=(100, 10)), columns=list('ABCDEFGHIJ'))
#you can already drop from columns names, converting to list is not necessary
cols = data.columns.drop(['A', 'J'])
#alternative solution
cols = data.columns.difference(['A', 'J'], sort=False)
data[cols] = data[cols].div(data['J'],axis=0)
print (data)
A B C D E F G H \
0 2 1.000000 0.200000 0.200000 0.400000 1.600000 1.200000 0.800000
1 2 0.428571 0.285714 0.857143 1.142857 0.142857 0.714286 0.142857
2 2 0.222222 0.444444 1.000000 0.111111 0.222222 0.222222 0.333333
3 2 1.500000 3.000000 0.500000 0.500000 3.500000 2.000000 3.000000
4 1 0.666667 1.333333 0.833333 0.166667 1.166667 0.500000 1.500000
.. .. ... ... ... ... ... ... ...
95 8 0.857143 1.142857 0.142857 1.000000 0.571429 0.142857 1.000000
96 1 5.000000 4.000000 8.000000 8.000000 2.000000 7.000000 3.000000
97 2 0.888889 0.222222 0.222222 0.666667 1.000000 0.333333 0.444444
98 7 2.333333 0.666667 3.000000 2.000000 0.666667 2.000000 1.333333
99 2 2.000000 6.000000 8.000000 5.000000 9.000000 5.000000 3.000000
I J
0 0.800000 5
1 1.000000 7
2 1.000000 9
3 1.000000 2
4 0.833333 6
.. ... ..
95 0.857143 7
96 3.000000 1
97 1.000000 9
98 1.000000 3
99 8.000000 1
[100 rows x 10 columns]
如果需要添加新列,請使用concat:
df = pd.concat([data, data[cols].div(data['J'], axis=0).add_suffix('/J')], axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461315.html
上一篇:根據自定義向量對資料框進行排序
下一篇:日期間隔平均Python熊貓
