我想在不使用函式“.merge”的情況下合并 2 個資料幀,并嘗試根據間隔和 id 為資料幀列分配一個值。
intervals = pd.DataFrame(
columns=["ID", "From", "To", "Interval"], data=[[1, 0, 100, "In"]]
)
print("intervals\n", intervals, "\n")
points = pd.DataFrame(
columns=["ID", "From", "To", "Value"],
data=[[1, 1, 2, "A"], [2, 2, 10, "B"], [1, 15, 150, "C"], [1, 345, 350, "D"]],
)
print('points\n',points,'\n')

我的嘗試:
def calculate_value(x):
return intervals.loc[
(x >= intervals["From"]) & (x < intervals["To"]), "Interval"
].squeeze()
desired_result = points.copy()
desired_result['Value_New'] = desired_result['From'].apply(calculate_value)
和輸出:

但我想要這個:

這些點必須在區間之間,這就是“15 - 150”在“Value_New”中沒有價值的原因。
怎么做?
資料來源:如何根據 Pandas 中的間隔分配值
uj5u.com熱心網友回復:
這是一種方法:
# Filter "points" dataframe to retain only the rows that match given conditions
mask = (
(points["ID"].isin(intervals["ID"].values))
& (points["From"] >= intervals["From"].values[0])
& (points["To"] <= intervals["To"].values[0])
)
# Add a new column "Value_New" to "points" dataframe and fill it once with bool values
# and then with the desired values ("In" or empty string)
points = points.assign(Value_New=mask).pipe(
lambda df: df.assign(Value_New=df["Value_New"].apply(lambda x: "In" if x else ""))
)
print(points)
# Output
ID From To Value Value_New
0 1 1 2 A In
1 2 2 10 B
2 1 15 150 C
3 1 345 350 D
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474524.html
