【问题标题】:Creating Modified Values inside a Column in Pandas DataFrame在 Pandas DataFrame 的列中创建修改后的值
【发布时间】:2021-07-27 06:54:46
【问题描述】:

我不确定这个问题有多严重。但我遇到了问题并需要帮助:

我有一个示例 pandas datframe 如下(比如说):

       df 

     C   A      V   D
     9  apar    1   0
     8  bpar    4   8
     7  cpar    7   7
     0  apar    8   6
     8  apar    9   4
     9  bpar    3   2

所以我需要做的是附加现有的数据框,只要我有'A' col 有'apar',然后创建一个新值作为'apar_t',并通过说改变'V'的值( 0.5) 并更新数据框。所以在这个玩具示例中,我的数据框应该如下所示:

    df

       C    A       V     D
       9    apar    1.0   0
       8    bpar    4.0   8
       7    cpar    7.0   7
       0    apar    8.0   6
       8    apar    9.0   4
       9    bpar    3.0   2
       9    apar_t  0.5   0
       0    apar_t  7.5   6
       8    apar_t  8.5   4

我一直在做并且能够解决这个问题,但我认为它不是 pythonic 并且对于庞大的数据集效率不高。我会询问是否可以找到更好的方法来解决问题;

我做了以下事情:

       sub_df = df[df['A']=='apar']
       colsOrder = df.columns
       sub_df = sub_df.rename(columns={'A': 'A1', 'V': 'V1'})

       sub_df['A'] ='apar_t'
       sub_df['V'] = sub_df['V1'] - 0.5

       sub_df.drop(columns=['A1', 'V1'])
       sub_df = sub_df[colsOrder]

       frames =[df,sub_df]
       DF = pd.concat(frames).reset_index(drop=True)
       DF

代码有效,我得到了我想要的。但我一直在寻找更优雅的 Pythonic 和高效的解决方案。任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas iterator subset calculated-columns


    【解决方案1】:
    x = df.loc[df.A == "apar"].copy()
    x.loc[:, "V"] = x.loc[:, "V"] - 0.5
    x.loc[:, "A"] = x.loc[:, "A"] + "_t"
    out = pd.concat([df, x])
    print(out)
    

    打印:

       C       A    V  D
    0  9    apar  1.0  0
    1  8    bpar  4.0  8
    2  7    cpar  7.0  7
    3  0    apar  8.0  6
    4  8    apar  9.0  4
    5  9    bpar  3.0  2
    0  9  apar_t  0.5  0
    3  0  apar_t  7.5  6
    4  8  apar_t  8.5  4
    

    【讨论】:

      【解决方案2】:

      在您只从行值中添加或减去值的情况下,这是一种简洁的方法:

      pd.concat([df, df.loc[df.A == 'apar'].apply(
          lambda row: row.add([0, '_t', -0.5, 0]), axis=1)])
      

      数据框:

         C       A    V  D
      0  9    apar  1.0  0
      1  8    bpar  4.0  8
      2  7    cpar  7.0  7
      3  0    apar  8.0  6
      4  8    apar  9.0  4
      5  9    bpar  3.0  2
      0  9  apar_t  0.5  0
      3  0  apar_t  7.5  6
      4  8  apar_t  8.5  4
      

      否则,您可以为行转换定义一个函数:

      def transform_row(row):
          row['A'] = row['A'] + '_t'
          row['V'] = row['V'] - 0.5
          return row
      

      然后使用apply

      pd.concat([df, df.loc[df.A == 'apar'].apply(transform_row, axis=1)])
      

      生成的数据帧与上述相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-15
        • 2017-07-22
        • 2016-02-10
        • 1970-01-01
        • 2015-03-09
        • 2018-08-21
        相关资源
        最近更新 更多