Pandas Dataframe 根据条件变换
Pandas Dataframe fransform according to condition
我有以下数据框,想根据下面的函数转换数据框的值,但我无法使用 .transform
或 .apply
。
dgp_id 8 13
lasso_class 4.0 2.0
lasso_reg 3.0 1.0
rf_class 1.0 4.0
rf_reg 2.0 3.0
xgb_class 6.0 6.0
xgb_reg 5.0 5.0
def scoring(x):
if x == 1.0:
x = 1
elif x == 2.0:
x=1/2
elif x == 5.0:
x=-1/2
elif x==6.0:
x=-1
else:
x=0
假设您要转换的列名称为“mycol”,您可以显式替换它:
newvals = [scoring(item) for item in df['mycol']]
df['mycol'] = newvals
- 另请注意,您的评分函数底部需要“return x”
IIUC,您可以结合使用 transform
、map
和 fillna
来创建像这样的基于列的更改。
- transform 将对我们指定的每个列应用一个函数
map
会根据字典给我们改值
fillna
将处理 fallthrough 情况 - map
字典中没有的任何内容都将被替换为该值
# create a mapping of old values to new values
scoring = {1.0: 1, 2.0: 1/2, 5.0: -1/2, 6.0: -1}
new_df = (
df.filter(["8", "13"]) # select columns to score
.transform(lambda column: column.map(scoring)) # convert values
.fillna(0) # fill in fallthrough cases
)
print(new_df)
8 13
0 0.0 0.5
1 0.0 1.0
2 1.0 0.0
3 0.5 0.0
4 -1.0 -1.0
5 -0.5 -0.5
如果你想将其与原始数据结合起来,你可以像这样使用 .join
:
full_df = df.join(new_df, rsuffix="_scored")
print(full_df)
dgp_id 8 13 8_scored 13_scored
0 lasso_class 4.0 2.0 0.0 0.5
1 lasso_reg 3.0 1.0 0.0 1.0
2 rf_class 1.0 4.0 1.0 0.0
3 rf_reg 2.0 3.0 0.5 0.0
4 xgb_class 6.0 6.0 -1.0 -1.0
5 xgb_reg 5.0 5.0 -0.5 -0.5
我有以下数据框,想根据下面的函数转换数据框的值,但我无法使用 .transform
或 .apply
。
dgp_id 8 13
lasso_class 4.0 2.0
lasso_reg 3.0 1.0
rf_class 1.0 4.0
rf_reg 2.0 3.0
xgb_class 6.0 6.0
xgb_reg 5.0 5.0
def scoring(x):
if x == 1.0:
x = 1
elif x == 2.0:
x=1/2
elif x == 5.0:
x=-1/2
elif x==6.0:
x=-1
else:
x=0
假设您要转换的列名称为“mycol”,您可以显式替换它:
newvals = [scoring(item) for item in df['mycol']]
df['mycol'] = newvals
- 另请注意,您的评分函数底部需要“return x”
IIUC,您可以结合使用 transform
、map
和 fillna
来创建像这样的基于列的更改。
- transform 将对我们指定的每个列应用一个函数
map
会根据字典给我们改值fillna
将处理 fallthrough 情况 -map
字典中没有的任何内容都将被替换为该值
# create a mapping of old values to new values
scoring = {1.0: 1, 2.0: 1/2, 5.0: -1/2, 6.0: -1}
new_df = (
df.filter(["8", "13"]) # select columns to score
.transform(lambda column: column.map(scoring)) # convert values
.fillna(0) # fill in fallthrough cases
)
print(new_df)
8 13
0 0.0 0.5
1 0.0 1.0
2 1.0 0.0
3 0.5 0.0
4 -1.0 -1.0
5 -0.5 -0.5
如果你想将其与原始数据结合起来,你可以像这样使用 .join
:
full_df = df.join(new_df, rsuffix="_scored")
print(full_df)
dgp_id 8 13 8_scored 13_scored
0 lasso_class 4.0 2.0 0.0 0.5
1 lasso_reg 3.0 1.0 0.0 1.0
2 rf_class 1.0 4.0 1.0 0.0
3 rf_reg 2.0 3.0 0.5 0.0
4 xgb_class 6.0 6.0 -1.0 -1.0
5 xgb_reg 5.0 5.0 -0.5 -0.5