【问题标题】:Python pandas apply function on columns value (base on columns names patern)Python pandas 在列值上应用函数(基于列名模式)
【发布时间】:2020-08-11 05:55:10
【问题描述】:

我有一个数据框:

a b  val1_b1 val1_b2 val2_b1 val2_v2
1 2    5       9        4      6

我想按列组取最大值,所以数据框将是:

a b  val1  val2 
1 2    9     6  

或 RMS:

a b       val1    val2
1 2    sqrt(106)   sqrt(52)   

最好的方法是什么?

【问题讨论】:

  • 那么如果使用max,为什么输出54?为什么_v2 在最后一列名称中?为什么10652 在最后一个df
  • @jezrael 对不起,由于某种原因,帖子被搞砸了,我现在编辑一个修复
  • 第二个RMS 是必要的实际和预测列,不确定输入数据中有哪些列。
  • @jezrael 很好,max 正在工作,但不确定您的意思是什么以及如何应用 RMS?
  • @jezrael 我的意思是 RMS 而不是 RMSE - 意思是 sqrt(val1_b1^2 + val1_b2^2)

标签: python pandas dataframe data-munging


【解决方案1】:

您可以将maxDataFrame.groupby 按列、axis=1 和 lambda 函数用于在第一个 _ 之前的值(如果存在):

df1 = df.groupby(lambda x: x.split('_')[0], axis=1).max()
print (df1)
   a  b  val1  val2
0  1  2     9     6

编辑RMS 使用:

df2 = df.iloc[:, :2]
df3 = df.iloc[:, 2:].pow(2).groupby(lambda x: x.split('_')[0], axis=1).sum().pow(1./2)

#alternative
df3 = (df.iloc[:, 2:].groupby(lambda x: x.split('_')[0], axis=1)
         .apply(lambda a: pd.Series(np.linalg.norm(a))))

df4 = pd.concat([df2, df3], axis=1)
print (df4)

   a  b      val1      val2
0  1  2  10.29563  7.211103

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2020-07-09
    • 2023-04-08
    相关资源
    最近更新 更多