【问题标题】:programmatically select columns for pd.melt以编程方式为 pd.melt 选择列
【发布时间】:2019-05-26 19:24:33
【问题描述】:

致力于自动化月度报告。试图在 pandas melt 函数中找到手动输入列名的替代方法 id_varsvalue_vars。是否可以以编程方式执行此操作?

考虑一个包含 a、b、c、'12/01/2018'、'12/02/2018'、'12/03/2018' 等列的 df,其中 a、b、c 始终是 @ 987654323@ 和给定月份的每日日期(在这种情况下为 12 月)是 value_vars 以取消透视。而不是写出来

pd.melt(id_vars=['a','b','c'],value_vars=['12/01/2018', 
'12/02/2018','12/03/2018', etc.])

是否可以以编程方式将 value_vars 分配给 melt 函数,以便每个月都可以使用相同的代码? (1 月将有 31 天的时间进行反透视,但 2 月将有 28 天)。

我不是 pythonista,感谢您花时间帮助我。

【问题讨论】:

  • 什么是“a,b,c”,它们代表什么?你从哪里得到这些值?我假设他们并不总是a,b,c?这个问题需要更多解释才能清楚。对于 value_vars,您是否只是在寻找格式为 MM/DD//YYYY(一月等 31 个字段)的当前月份的日期列表?
  • 一些示例数据在这里会有很长的路要走。

标签: python pandas


【解决方案1】:

你可以使用:

df.melt(['a','b','c'])

df.melt 状态的文档字符串:

value_vars :元组、列表或 ndarray,可选 要取消透视的列。如果未指定,则使用所有列 未设置为id_vars

因此,您已将 id_vars 设置为他的第一个参数,并且所有其他列将用作每个文档的 value_vars。

【讨论】:

  • 感谢您提出文档所说的内容。这是处理我想做的事情的最有效方式。
【解决方案2】:

如果是 IIUC,您只需将列分开即可。套装在这里很有帮助而且速度很快。当然,假设列名是唯一的(应该如此):

id_vars = {'a', 'b', 'c'}
value_vars = set(df.columns) - id_vars
pd.melt(df, id_vars=id_vars, value_vars=value_vars)

【讨论】:

    【解决方案3】:

    使用 -

    id_vars = ['a', 'b', 'c']
    value_vars = df.columns.difference(id_vars)
    pd.melt(df, id_vars=id_vars, value_vars=value_vars)
    

    【讨论】:

    • 工作就像一个魅力。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多