【问题标题】:Add new column to dataframe with variable length将新列添加到具有可变长度的数据框
【发布时间】:2018-12-23 19:19:18
【问题描述】:

我有一个关于将结果添加到现有数据框的问题。

if relevant_item != 'None' and relevant_item != 'Not in dict':
    items = relevant_item
    len_item = len(items)

    if len_item == 1:
        item_result = items

    if len_item == 2:
        two = items
        item_result = some_method(two)

    if len_item == 3:
        threes = items
        item_result = some_method(three)

hash_in_dict_shopping.append(item_result)#new list of list

shops = pd.Series(hash_in_dict_shopping)
df_final['hash_in_shop'] = shops.values

将新列表附加到现有数据框时,我收到一条错误消息“ValueError:值的长度与索引的长度不匹配”,所以我想知道如何将新列表添加到新列并填充所有缺少“无”的行值,同时保持原始顺序?

过滤前的原始数据(约700行):

'None'
'Not in dict'
['apple','banana', 'grapes']
'None'
'Not in dict'
'Not in dict'
['pasta', 'rice', 'lentils']
'None'
'None'
['milk']

过滤相关项目的数据后(大约 40 行):

 ['apple','banana', 'grapes']
 ['pasta', 'rice', 'lentils']
 ['milk']

应用 some_method 后(从字典中返回一个值):

['fruit','green groceries']
['dry food', 'staples', 'legumes']
['dairy']

数据框中的新列包含所有 700 行:

'None'
'None'
['fruit','green groceries']
'None'
'None'
'None'
['dry food', 'staples', 'legumes']
'None'
'None'
['dairy']

【问题讨论】:

    标签: python python-3.x pandas dataframe series


    【解决方案1】:

    有2点需要注意:

    1. 在迭代您的系列时,您不应忽略/跳过“None”/“Not in dict”行。您的新系列必须与原始系列的长度相同。
    2. 您应该使用内置的 Pandas 功能来逐行应用函数。由于您不能使用矢量化功能(因为您的数据框包含 list 对象),您可以将 pd.Series.apply 与自定义函数一起使用。

    这是一个最小的例子:

    df = pd.DataFrame({'col': ['None', 'Not in dict', ['apple', 'banana', 'grapes'],
                               'None', ['mile'], 'Not in dict']})
    
    def calculated(x):
        try:
            if x in {'Not in dict', 'None'}:
                return None
        except TypeError:
            if len(x) == 1:
                return 2
            elif len(x) == 2:
                return 4
            else:
                return 6
    
    df['calc'] = df['col'].apply(calculated)
    
    print(df)
    
                           col  calc
    0                     None   NaN
    1              Not in dict   NaN
    2  [apple, banana, grapes]   6.0
    3                     None   NaN
    4                   [mile]   2.0
    5              Not in dict   NaN
    

    【讨论】:

      【解决方案2】:

      您是否尝试设置一个空数组,然后更改值(如果有)?

      import numpy as np
      items = numpy.empty((len(DataFrame))
      items[:] = numpy.nan
      
      if relevant_item != 'None' and relevant_item != 'Not in dict':
      items[i] = relevant_item # supposing you have some so
      len_item = count_nonzero(np.isnan(items))
      
      if len_item == 1:
          item_result = items
      
      if len_item == 2:
          two = items
          item_result = some_method(two)
      
      if len_item == 3:
          threes = items
          item_result = some_method(three)
      

      这样,您的 items 数组的长度与数据框的长度相同,您将不会收到该错误。如果 NaN 数组不合适,为什么不试试 numpy.zeros 呢?

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 2020-09-11
        • 1970-01-01
        • 2023-03-23
        • 2011-10-27
        相关资源
        最近更新 更多