【问题标题】:Populating a data frame using from separate table using loc使用 loc 从单独的表中填充数据框
【发布时间】:2023-03-07 23:47:01
【问题描述】:
data1={'Policy Number':['FSH1235456','FSH7643643','CHH123124','CHH123145252','CHH124124'],'State':['FL','TX','GA','TX','TX'],'TERR':[1,2,3,4,5]}

data2={'TERR':[1,2,3,4,5],'CHH':[0,.15,.65,.35,.20],'FSH':[0,.15,.25,.35,.20]}

output={'Policy Number':['FSH1235456','FSH7643643','CHH123124','CHH123145252','CHH124124'],'State':['FL','TX','GA','TX','TX'],'TERR':[1,2,3,4,5],'Test':[0,.15,0,0,0]}


df1=pd.DataFrame(data1)

df2=pd.DataFrame(data2)

df3=pd.DataFrame(output)

上面的测试数据。

我正在尝试在 df1 中创建一个新列,将其命名为 df1['Test'],其中包含基于以下条件的 df2['FSH'] 的值:

  1. 状态为“TX”
  2. 策略编号包含“FSH” 3.df1["Terr"]的值=df2['TERR']的值

查看 df3 以获得正确的输出。

我尝试做的是以下内容;

if df1.State.any()=="TX":
    if df1["Policy Number"].str.contains("FSH").any():
        for i in df["TERR"]:
            df1['% TERR']=df2.loc[[i],["FSH"]]

但是,我的输出充满了 NAN,以及 1 个唯一正确答案。

我尝试检查以确保通过

将正确的 i 值输入 df2
print(df2.loc[[i],["FSH"]]

并且打印正确。

有什么想法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我不知道这是否是最好或最快的解决方案,但一种选择是合并您的 2 个数据框,然后根据您的条件进行过滤,然后更新:

    new = df1.merge(df2, on='TERR')
    mask = new[((new['State']=='TX') & (new['Policy Number'].str.contains('FSH')))]
    
    df1['Test'] = 0
    df1['Test'].update(mask['FSH'])
    
        Policy Number   State   TERR    Test
    0   FSH1235456        FL    1       0.00
    1   FSH7643643        TX    2       0.15
    2   CHH123124         GA    3       0.00
    3   CHH123145252      TX    4       0.00
    4   CHH124124         TX    5       0.00
    

    【讨论】:

      【解决方案2】:

      你可以通过传递条件使用 numpy where,

      cond1 = (df1['State'] == 'TX')
      cond2 = (df1['Policy Number'].str.contains('FSH'))
      cond3 = (df1["TERR"] == df2['TERR'])
      df1['Test'] = np.where(cond1 & cond2 & cond3, df2['FSH'], 0)
      
          Policy Number   State   TERR    Test
      0   FSH1235456      FL      1       0.00
      1   FSH7643643      TX      2       0.15
      2   CHH123124       GA      3       0.00
      3   CHH123145252    TX      4       0.00
      4   CHH124124       TX      5       0.00
      

      【讨论】:

      • 这是一个很好的解决方案,但是您如何考虑形状不完全匹配的情况?
      • 当数据框的形状不匹配时,您可以使用映射,但在这种情况下,映射只能基于 TERR 列。其他两个条件仍然是基于索引的
      【解决方案3】:

      您只是想将数据从df2 获取到df1 吗?如果是这样,您可以使用melt 重塑df2,然后执行merge

      df1['policy_prefix'] = df1['Policy Number'].str[:3]
      df2 = df2.melt(id_vars='TERR', value_vars=['CHH', 'FSH'], 
                     value_name='Test', 
                     var_name='policy_prefix')
      df1 = df1.merge(df2, on=['policy_prefix', 'TERR'])
      

      如果您只想将此应用于状态为“TX”的行,那么您可以在合并后将其他值设置为 null:

         import numpy as np 
         df1.loc[df1.State!='TX', 'Test'] = np.nan
      

      【讨论】:

        【解决方案4】:

        这是您的解决方案:

        # ... initialize df1 and df2 here
        df3 = df1.join(df2.FSH)  # Merge df1 and df2 into a single dataframe
        df3 = df3.rename({"FSH": "TEST"}, axis=1)  # Change column name
        
        def set_tx_fsh(row):
            if row.State == "TX" and "FSH" in row["Policy Number"]:
                return row.TEST
            else:
                return 0
        
        df3.TEST = df3.apply(set_tx_fsh, axis=1)  # Set values in "TEST" column based on your condition
        

        【讨论】:

          猜你喜欢
          • 2021-03-03
          • 1970-01-01
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 2012-09-02
          • 2022-06-17
          • 2021-04-10
          相关资源
          最近更新 更多