我試圖確定 a 的一行中的給定值是否在DataFrame來自單獨的 的另外兩列內DataFrame,或者該估計值是否為零。
import pandas as pd
df = pd.DataFrame([[-1, 2, 1, 3], [4, 6, 7,8], [-2, 10, 11, 13], [5, 6, 8, 9]],
columns=['lo1', 'up1','lo2', 'up2'])
lo1 up1 lo2 up2
0 -1 2 1 3
1 4 6 7 8
2 -2 10 11 13
3 5 6 8 9
df2 = pd.DataFrame([[1, 3], [4, 6] , [5, 8], [10, 2,]],
columns=['pe1', 'pe2'])
pe1 pe2
0 1 3
1 4 6
2 5 8
3 10 2
更清楚地說,是否可以開發一個for-loop 或使用一個函式來查看pe1及其對應的值并確定它們是否在lo1and內up1,如果lo1和up1交叉零,以及 if pe1=0?我很難用 Python 撰寫代碼。
編輯:我希望輸出類似于:
m1 m2
0 0 3
1 4 0
2 0 0
3 0 0
由于只有pe其對應之內lo和up列是第一行,第二列,行和第二行,第一列英寸
uj5u.com熱心網友回復:
您最終可以沿水平軸連接兩個資料框,然后使用np.where. 這與whereRJ Adriaansen 使用的行為類似。
import pandas as pd
import numpy as np
# Data
df1 = pd.DataFrame([[-1, 2, 1, 3], [4, 6, 7,8], [-2, 10, 11, 13], [5, 6, 8, 9]],
columns=['lo1', 'up1','lo2', 'up2'])
df2 = pd.DataFrame([[1, 3], [4, 6] , [5, 8], [10, 2,]],
columns=['pe1', 'pe2'])
# concatenate dfs
df = pd.concat([df1, df2], axis=1)
現在df看起來像
lo1 up1 lo2 up2 pe1 pe2
0 -1 2 1 3 1 3
1 4 6 7 8 4 6
2 -2 10 11 13 5 8
3 5 6 8 9 10 2
最后我們使用np.where和between
for k in [1, 2]:
df[f"m{k}"] = np.where(
(df[f"pe{k}"].between(df[f"lo{k}"], df[f"up{k}"]) &
df[f"lo{k}"].gt(0)),
df[f"pe{k}"],
0)
結果是
lo1 up1 lo2 up2 pe1 pe2 m1 m2
0 -1 2 1 3 1 3 0 3
1 4 6 7 8 4 6 4 0
2 -2 10 11 13 5 8 0 0
3 5 6 8 9 10 2 0 0
uj5u.com熱心網友回復:
您可以為所需條件創建一個布爾掩碼。因為pe1那將是:
- 值
lo1小于或等于pe1 - 值 in
up1大于或等于pe1 - 值
lo1大于0
這將使這個面具:
(df['lo1'] <= df2['pe1']) & (df['up1'] >= df2['pe1']) & (df['lo1'] > 0)
回傳:
0 False
1 True
2 False
3 False
dtype: bool
現在您可以使用where來保留匹配的值True并用 替換那些不匹配的值0:
df2['pe1'] = df2['pe1'].where((df['lo1'] <= df2['pe1']) & (df['up1'] >= df2['pe1']) & (df['lo1'] > 0), other=0)
df2['pe2'] = df2['pe2'].where((df['lo2'] <= df2['pe2']) & (df['up2'] >= df2['pe2']) & (df['lo2'] > 0), other=0)
結果:
| pe1 | pe2 | |
|---|---|---|
| 0 | 0 | 3 |
| 1 | 4 | 0 |
| 2 | 0 | 0 |
| 3 | 0 | 0 |
回圈所有列:
for i in df2.columns:
nr = i[2:] #remove the first two characters to get the number, then use that number to match the columns in the other df
df2[i] = df2[i].where((df[f'lo{nr}'] <= df2[i]) & (df[f'up{nr}'] >= df2[i]) & (df[f'lo{nr}'] > 0), other=0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/402562.html
標籤:
