【问题标题】:Add row to dataframe if condition is met如果满足条件,则将行添加到数据框
【发布时间】:2021-10-15 22:50:51
【问题描述】:

我有以下数据集:

如果 Crack == "Y",我需要使用 Outright1 和 Outright2 中的名称添加 2 个新行。但是 Outright2 的位置将乘以 -1。

我已经应用了以下方法:

for i in data.index:
    if(data.Crack[i]=="Y"):
        new_row = {'Position':data['Position'][i],'Contract':data['Outright1'][i],'Outright1':np.nan,'Outright2':np.nan,'Crack':"N"}
        new_row2 = {'Position':data['Position'][i]*-1,'Contract':data['Outright2'][i],'Outright1':np.nan,'Outright2':np.nan,'Crack':"N"}
        data = data.append(new_row, ignore_index = True)
        data = data.append(new_row2, ignore_index = True)

并设法得到我想要的输出:

但是只是想知道是否有更好、更有效的编码方式?

【问题讨论】:

  • 我不知道还有什么比data[data['Crack']=='N'] 更高效或更好。您可以查看屏蔽 numpy 数组。

标签: python pandas for-loop if-statement


【解决方案1】:

使用melt 重新格式化您的数据框:

out = df.melt(id_vars=['Position'], value_vars=['Outright1', 'Outright2'],
              var_name='Type', value_name='Contract').dropna(subset=['Contract'])

out = out.assign(Crack='N',
                 Position=np.where(out['Type'] == 'Outright2',
                                   out['Position']*-1, out['Position'])) \
        .drop(columns='Type')
>>> pd.concat([df, out], ignore_index=True)

   Position Contract Outright1 Outright2 Crack
0         1     ICFX       NaN       NaN     N
1        -1     ICFY      ICFA      ICFB     Y
2         1     ICFZ       NaN       NaN     N
3         1     ICFW      ICFY      ICFY     Y
4        -1     ICFA       NaN       NaN     N
5         1     ICFY       NaN       NaN     N
6         1     ICFB       NaN       NaN     N
7        -1     ICFY       NaN       NaN     N

【讨论】:

    【解决方案2】:

    不妨试试这样的:

    spreads = data[data["Crack"]=="Y"].drop(["Contract", "Crack"], axis=1).set_index("Position").stack().rename("Contract").reset_index()
    #flip the position for outright2
    spreads["Position"] = spreads["Position"].where(spreads["level_1"]=="Outright1", -spreads["Position"])
    
    output = data[data["Crack"]=="N"][["Position", "Contract"]].append(spreads[["Position", "Contract"]], ignore_index=True)
    
    >>> output
       Position Contract
    0         1     ICFX
    1         1     ICFZ
    2        -1     ICFA
    3         1     ICFB
    4         1     ICFX
    5        -1     ICFY
    

    【讨论】:

      猜你喜欢
      • 2017-09-15
      • 2016-11-06
      • 1970-01-01
      • 2020-11-14
      • 2012-05-12
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      相关资源
      最近更新 更多