【问题标题】:Optionally Select Columns from Pandas Data Frame可选择从 Pandas 数据框中选择列
【发布时间】:2019-09-05 19:27:56
【问题描述】:

我编写了一个函数,它获取文件路径列表,然后将它们连接到一个大数据帧中。我想包含一个参数,该参数采用用户有兴趣查看的列名列表。

如果用户决定过滤列,数据框必须始终包含“类别”列,但我希望默认为它返回所有列。我似乎不太明白如何从数据框中选择性地选择列。

这是我的函数,其中穿插了一些伪代码来解释我在说什么。

def combine_all_data(data_files, columns_needed=ALL):
    dataframes = map(pd.read_csv, data_files)

    if columns_needed != ALL
        columns_needed = ['category'] + columns_needed

    df = pd.concat(dataframes, sort=False)[columns_needed]
    return df

【问题讨论】:

  • 我不明白问题所在。您面临的具体问题是什么?
  • 我们看不到ALL,所以大概您在某些情况下会添加两次'category'
  • category 是在幕后添加的一个用户不会真正知道的列,所以我不希望它作为用户的输入。这就是为什么总是需要确保类别存在,但需要处理用户未定义 columns_needed 的情况(我无法返回空数据框)
  • if 'category' not in columns_needed:?如果指定列表为None,则添加ALL。如果不是None 但不包括'categories',则在前面加上categories。否则,请使用他们提供的清单。 3 种可能性,您只涵盖 2。对请求的列列表的任何更改都会导致您将 category 添加到列列表中。但这违背了能够毫无后果地删除其他列的意义
  • 顺便说一句。也许您还需要在concat 调用中指定ignore_index=True,以防数据帧具有常规整数索引(很可能它们具有)。否则结果索引中可能有重复的结果。

标签: python pandas python-2.7


【解决方案1】:

如果是ALL你不知道怎么实现,可以试试这个:

def combine_all_data(data_files, columns_needed=None):
    kwargs= dict()
    if columns_needed is not None:
        if 'category' not in columns_needed:
            columns_needed= ['category'] + columns_needed
        kwargs['usecols']= columns_needed
    dataframes = [pd.read_csv(data_file, **kwargs) for data_file in data_files]
    return pd.concat(dataframes, sort=False)

这样做的好处是,您需要更少的内存,因为您不想看到的列在阅读过程中已经被跳过了。 另外,您返回一个完整的数据框而不是一个切片。所以你可以不受限制地使用它。

【讨论】:

  • 谢谢@roganjosh:我添加了它。我猜结果会是重复的列。
  • 本来可以的,是的:)
【解决方案2】:

read_csv 有一个 usecols 参数:

def combine_all_data(data_files, columns_needed='ALL'):
   if needed_columns != 'ALL':
      if not 'category' in columns_needed:
         columns_needed.append('category')
      return pd.concat([pd.read_csv(x, usecols=columns_needed) for x 
      in data_files], sort=False)
   else: 
      return pd.concat([pd.read_csv(x) for x in data_files], sort=False)

【讨论】:

  • 您不能对多行代码使用单个反引号来获得正确的格式。突出显示整个代码块并使用 ctrl +k 或单击编辑器中的{} 按钮,或使用三个反引号
  • 我们几乎有同样的想法。顺便提一句。 pd.read_csv(x, usecols='ALL') 真的有用吗?但除此之外,您也只需将其翻译为 None 或任何 pandas 用作关键字的默认值。
  • 不,它没有。它只是一个可以是任何东西的字符串。关键是如果columns_needed 等于默认参数,则执行else 语句,其中不使用usecols 参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2021-02-23
相关资源
最近更新 更多