pandas 基于Python中的2个不同条件在新列中追加值

eni9jsuy  于 2023-01-07  发布在  Python
关注(0)|答案(2)|浏览(154)

我有一个样本数据集,它类似于下面定义的数据集。

dict_1 = {'Id' : [1, 1, 2, 2, 3, 4],
         'boolean_val' : [True, False, True, False, True, False],
         "sal" : [1000, 2000, 1500, 2500, 3500, 4500]}

test = pd.DataFrame(dict_1)
test.head(10)

我必须根据给定条件在测试 Dataframe 中创建2个新列,即output_True和output_False:
a)如果Id[0] == Id[1]且boolean_瓦尔=真,则将sal[0](因为这是boolean_val =真时的值)放入output_True中,否则为“NA”.
B)如果Id[0] == Id[1]且boolean_瓦尔=假,则将sal[1](因为这是当boolean_val =假时的值)放入output_False中,否则为“NA”.
c)如果Id[0] 1= Id[1] & boolean_瓦尔== True,则将该行的sal值放入output_True,否则如果Id[0] 1= Id[1] & boolean_val == False,则将该行的sal值放入output_False。
如果我没有正确框我的问题,然后请检查下面的数据框输出,我希望我的输出类似于输出真和输出假如下所示。

dict_1 = {'Id' : [1, 1, 2, 2, 3, 4],
         'boolean_val' : [True, False, True, False, True, False],
         "sal" : [1000, 2000, 1500, 2500, 3500, 4500],
         "output_True" : [1000, "NA", 1500, "NA", 3500, "NA"],
         "output_False" : [2000, "NA", 2500, "NA", "NA", 4500]}

output_df = pd.DataFrame(dict_1)
output_df.head(10)

我试过使用np.where()& list解析,但是我的输出数据没有显示正确的值。有人能帮我吗?

gc0ot86w

gc0ot86w1#

使用loc为布尔列赋值。对于第二个条件,可以使用.shift()并比较Id[0] == Id[1]值和基于此的sum:

dict_1 = {'Id' : [1, 1, 2, 2, 3, 4],
         'boolean_val' : [True, False, True, False, True, False],
         "sal" : [1000, 2000, 1500, 2500, 3500, 4500]}

test = pd.DataFrame(dict_1)
test

    Id  boolean_val sal
0   1   True    1000
1   1   False   2000
2   2   True    1500
3   2   False   2500
4   3   True    3500
5   4   False   4500

cond1 = test.boolean_val
test.loc[cond1, 'output_True'] = test.sal

cond2 = (test.Id.shift(-1).eq(test.Id))
test['output_False'] = np.nan
test.loc[cond2, 'output_False'] = test['sal'] + test['output_True']
test

    Id  boolean_val sal output_True output_False
0   1   True    1000    1000.0  2000.0
1   1   False   2000    NaN     NaN
2   2   True    1500    1500.0  3000.0
3   2   False   2500    NaN     NaN
4   3   True    3500    3500.0  NaN
5   4   False   4500    NaN     NaN
qxsslcnc

qxsslcnc2#

以下是获得所需输出的方法:

df = test.pivot(index='Id', columns='boolean_val', values='sal')
df = df.assign(boolean_val=df.loc[:,True].notna()).set_index('boolean_val', append=True)
df = df.rename(columns={True:'output_True', False:'output_False'})[['output_True', 'output_False']]

output_df = test.join(df, on=['Id','boolean_val'])
for col in ('output_True', 'output_False'):
    output_df[col] = np.where(output_df[col].isna(), "NA", output_df[col].astype(pd.Int64Dtype()))

输出:

Id boolean_val   sal output_True output_False
0   1        True  1000        1000         2000
1   1       False  2000          NA           NA
2   2        True  1500        1500         2500
3   2       False  2500          NA           NA
4   3        True  3500        3500           NA
5   4       False  4500          NA         4500

说明:

  • 使用pivot()创建中间 Dataframe dfTrueFalse列包含每个Id对应的sal
  • 添加包含Trueboolean_val列,除非给定行的True列为NaN
  • Id, boolean_val设置为df的索引
  • TrueFalse列重命名为output_Trueoutput_False,并交换它们的位置(以匹配所需的输出)
  • 使用join()创建output_df,它是test with added columns输出_真and输出_假'
  • NaN替换为字符串"NA",并将output_Trueoutput_False中的sal值从浮点型更改为整型。

相关问题