【问题标题】:Create multiple dataframe columns containing calculated values from an existing column创建多个数据框列,其中包含来自现有列的计算值
【发布时间】:2018-05-31 15:09:09
【问题描述】:

我有一个数据框,sega_df

Month            2016-11-01     2016-12-01
Character                                                        
Sonic            12.0            3.0
Shadow           5.0             23.0

我想创建多个新列,方法是为我的数据框中的每个现有列应用一个公式(简而言之,列数几乎翻倍)。该公式是(100 - [5*eachcell])*0.2

例如,Sonic 的 11 月,(100-[5*12.0])*0.2 = 8.0,Sonic 的 12 月,(100-[5*3.0])*0.2 = 17.0 我的理想输出是:

Month            2016-11-01     2016-12-01     Weighted_2016-11-01    Weighted_2016-12-01
Character                                                        
Sonic            12.0            3.0           8.0                    17.0
Shadow           5.0             23.0          15.0                   -3.0  

我知道如何创建一个 for 循环来创建一列。如果只考虑 一个 个月:

for w in range(1,len(sega_df.index)):
    sega_df['Weighted'] = (100 - 5*sega_df)*0.2
    sega_df[sega_df < 0] = 0

我还没有获得创建多个列的技能或经验。我一直在寻找其他可能回答我到底在做什么但还没有任何工作的问题。提前致谢。

【问题讨论】:

  • 很好奇,你为什么要处理宽数据?在这里,日期应该是它自己的列,其值与其相邻。对于广泛的数据集,计算和争论非常困难。重塑为长格式,在没有循环的情况下运行所需的聚合,生活更轻松。
  • @Parfait 我之前在阅读 excel 表后应用了 .sum().groupby()。我的原始 Excel 表每个月每个字符都有多个条目,所以是的,日期之前有自己的列,并且我想将行数减少到唯一字符的数量。这样我就可以逐月查看趋势,只是为了我自己的兴趣。我只复制了前两个月和前两个字符以保持我的帖子简短。希望这可以澄清它。
  • 宽格式通常用于最终用途报告需求,应该是最后一步。再次,从 Excel 导入,使用melt 重塑为长格式,然后运行您的聚合/计算。无需循环或维护许多列。

标签: python pandas for-loop dataframe


【解决方案1】:

一种向量化的方法是淹没到numpy

A = sega_df.values
A = (100 - 5*A) * 0.2

res = pd.DataFrame(A, index=sega_df.index, columns=('Weighted_'+sega_df.columns))

然后将结果加入您的原始数据框:

sega_df = sega_df.join(res)

【讨论】:

  • 这行得通,除了 columns 参数会吐出 TypeError (must be str, not DatetimeIndex),因为我的列实际上是从 Excel 中读取的 DateTime 类型。目前正在努力正确分配列名并避免此类错误。
  • 是的,如果您要为列名添加前缀,那么在开始之前您可能希望它们都是字符串。类似df.columns = df.columns.map(str)
  • 您对将列标题转换为字符串有什么建议吗?
  • @ia_wing,是的,请参阅我之前的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2023-03-16
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多