【问题标题】:Can multiple columns be created using one apply call是否可以使用一次应用调用创建多个列
【发布时间】:2019-08-14 22:38:11
【问题描述】:

我正在尝试根据存储在另一列中的字典创建两列

df[[col1, col2]] = df[dict_data].apply(lambda x: x['col1_data'], x['col2_data'])

这可能吗?还是应该分两行来完成?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先,您的apply(...) 不起作用,因为x['col2_data'] 不被解释为lambda 的一部分,而是作为apply 函数的第二个参数。因此,要让两者都从 lambda 返回,您需要将它们包装在一个对象中,例如list()[x['col1_data'], x['col2_data']tuple(x['col1_data'], x['col2_data'])set{x['col1_data'], x['col2_data'}

    要实现你想要的,虽然你可以这样做:

    给定一个 pandas DataFrame 定义为:

    In[2] df = pd.DataFrame({'a': {'r1': {'k1': 1, 'k2': 2}, 'r2': {'k1': 1, 'k2': 2}}})
    In[3] df
    Out[3]: 
                         a
    r1  {'k1': 1, 'k2': 2}
    r2  {'k1': 1, 'k2': 2}
    

    你可以这样做:

    df[['b', 'c']] = pd.DataFrame(df.apply(lambda x: (x.a['k1'], x.a['k2']), axis=1).tolist(), index=df.index)
    

    这将产生:

    Out[6]: 
                         a  b  c
    r1  {'k1': 1, 'k2': 2}  1  2
    r2  {'k1': 1, 'k2': 2}  1  2
    

    您当然也可以在两条单独的线路中实现相同的目标,恕我直言,这样更清洁、更高效。

    希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      使用 jniegsch 的 df 示例:

      In[2] df = pd.DataFrame({'a': {'r1': {'k1': 1, 'k2': 2}, 'r2': {'k1': 1, 'k2': 2}}})
      In[3] df
      Out[3]: 
                           a
      r1  {'k1': 1, 'k2': 2}
      r2  {'k1': 1, 'k2': 2}
      

      另一种方法是:

      df[['b', 'c']] = pd.DataFrame(df.a.to_dict()).set_index(df.index)
      
          a                   b   c
      r1  {'k1': 1, 'k2': 2}  1   1
      r2  {'k1': 1, 'k2': 2}  2   2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2010-12-20
        • 2014-10-20
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多