我有一個資料集 df,我想在其中創建顯示減法計算輸出的列:
資料
count power id p_q122 p_q222 c_q122 c_q222
100 1000 aa 200 300 10 20
100 2000 bb 400 500 5 10
想要的
cnt pwr id p_q122 avail1 p_q222 avail2 c_q122 count1 c_q222 count2
100 1000 aa 200 800 300 700 10 90 20 80
100 2000 bb 400 1600 500 1500 5 95 10 90
正在做
a = df['avail1'] = df['pwr'] - df['p_q122']
b = df['avail2'] = df['pwr'] - df['p_q222']
我正在尋找一種更優雅的方式來提供欲望輸出。任何建議表示贊賞。
uj5u.com熱心網友回復:
嘗試:
df['avail1'] = df['power'].sub(df['p_q122'])
df['avail2'] = df['power'].sub(df['p_q222'])
uj5u.com熱心網友回復:
我們可以用 numpy 執行 2D 減法:
pd.DataFrame(
df['power'].to_numpy()[:, None] - df.filter(like='p_').to_numpy()
).rename(columns=lambda i: f'avail{i 1}')
avail1 avail2
0 800 700
1 1600 1500
這里的好處是,無論p_有多少列,都將從power列中減去。
我們可以concat使用 df進行所有計算,例如:
df = pd.concat([
df,
# power calculations
pd.DataFrame(
df['power'].to_numpy()[:, None] - df.filter(like='p_').to_numpy()
).rename(columns=lambda i: f'avail{i 1}'),
# Count calculations
pd.DataFrame(
df['count'].to_numpy()[:, None] - df.filter(like='c_').to_numpy()
).rename(columns=lambda i: f'count{i 1}'),
], axis=1)
這給出了df:
count power id p_q122 p_q222 ... c_q222 avail1 avail2 count1 count2
0 100 1000 aa 200 300 ... 20 800 700 90 80
1 100 2000 bb 400 500 ... 10 1600 1500 95 90
[2 rows x 11 columns]
如果我們有很多列組要做,我們也可以以編程方式構建 DataFrame 串列:
df = pd.concat([df, *(
pd.DataFrame(
df[col].to_numpy()[:, None] - df.filter(like=filter_prefix).to_numpy()
).rename(columns=lambda i: f'{new_prefix}{i 1}')
for col, filter_prefix, new_prefix in [
('power', 'p_', 'avail'),
('count', 'c_', 'count')
]
)], axis=1)
設定和匯入:
import pandas as pd
df = pd.DataFrame({
'count': [100, 100], 'power': [1000, 2000], 'id': ['aa', 'bb'],
'p_q122': [200, 400], 'p_q222': [300, 500], 'c_q122': [10, 5],
'c_q222': [20, 10]
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/310980.html
