【问题标题】:How to replace an empty dict with a values in pandas如何用熊猫中的值替换空字典
【发布时间】:2020-11-30 03:58:50
【问题描述】:

我有以下几点:

pd.DataFrame({
    'a' : { 1 : {}},
    'b' : {1 : 3}
})

看起来像:

    a  b
1  {}  3

并且希望能够用 0 或 NaN 替换 {},但我不知道该怎么做。我好像不能用.replace

pd.DataFrame({
    'a' : { 1 : {}},
    'b' : {1 : 3}
}).replace({ {} : 0})

报错

【问题讨论】:

  • 试试df = df.explode()

标签: python pandas data-manipulation data-cleaning


【解决方案1】:

你可以使用 bool ,当有空 dict 时它会返回 False

df=df.where(df.astype(bool),0)

df
Out[26]: 
   a  b
1  0  3

【讨论】:

    【解决方案2】:

    你可以这样做:

    df = pd.DataFrame({
        'a' : { 1 : {}},
        'b' : {1 : 3}
    })
    df.applymap((lambda x: 0 if x == {} else x))
    

    【讨论】:

      【解决方案3】:

      这个:

      pd.DataFrame({
          'a' : { 1 : {}},
          'b' : {1 : 3}
      }).replace({ {} : 0})
      

      导致错误,因为dict 的密钥必须是可散列的 - {} 不是。在这种情况下,您可以使用 pandas.DataFrame.replace 和两个长度相等的 lists,方法如下:

      import pandas as pd
      df = pd.DataFrame({
          'a' : { 1 : {}},
          'b' : {1 : 3}
      }).replace([{}],[0])
      print(df)
      

      输出:

         a  b
      1  0  3
      

      【讨论】:

        【解决方案4】:

        由于字典不可散列,.replace 无法作用于其中,但 pandas 具有处理可迭代对象的功能:.explode

        print(df.explode('a'))
             a  b
        1  NaN  3
        

        如果字典不是为空,而是从 0 开始的连续整数键 (0, 1, n-1),它仍然可以工作:

        df = pd.DataFrame({
            'a' : {1 : {0: 'row0', 1: 'row1'}},
            'b' : {1 : 3}
        })
        
        print(df.explode('a'))
              a  b
        1  row0  3
        1  row1  3
        

        如果字典不为空或者键不是严格连续的并且从 0 开始(例如 {2: val, 'string_key':val, -1:val} 将导致爆炸失败),它将引发异常到所有三个键)

        【讨论】:

          猜你喜欢
          • 2018-08-07
          • 2017-02-25
          • 1970-01-01
          • 2018-01-10
          • 2017-06-18
          • 1970-01-01
          • 1970-01-01
          • 2017-12-28
          • 2018-07-24
          相关资源
          最近更新 更多