【问题标题】:Python dataframe trimming: pd.concat() vs. df.drop() vs. df2 = df1[selectCols]Python 数据框修剪:pd.concat() vs. df.drop() vs. df2 = df1[selectCols]
【发布时间】:2016-02-06 18:05:23
【问题描述】:

数据框df1 包含列WeekMon:SunTotal

以下是从 df1 中的列创建新数据框“df2”的 3 种方法:

df2 = pd.concat(
    [df1.Sun,df1.Mon, 
    df1.Tues, df1.Weds,
    df1.Thurs, df1.Fri,
    df1.Sat], axis=1)

df2 = df1.drop(['Week', 'Total'], axis=1)

df2 = df1[['Sun','Mon','Tues','Weds','Thurs','Fri','Sat']]

这些有何不同?在什么情况下各自有利?

【问题讨论】:

  • 这是 R 还是 Python?
  • 如果您附上一些示例或数据框的一部分,那么测试这些方法会更容易
  • 绝对不是第一个;它又长又丑又低效。另外两个将取决于情况,例如您可能会选择相对较少的列或删除相对较少的列,如上例所示。您可能还希望向代码的读者明确选择(或删除)哪些列。我怀疑它们之间在内存使用方面有什么关系
  • 另外,drop 可以配置为通过传递 errors='ignore' 删除可能存在或不存在的列
  • df2 到底是什么 - 在此步骤之前它是否已初始化?

标签: python pandas dataframe concat


【解决方案1】:

我认为主要优势是处理时间。我拿了你的例子,制作了一些样本数据,并使用timeit 库对它们进行了比较。看起来选项 2 和 3 要快得多。如果有很多列并且不方便将它们全部写出来,我会使用选项 2,反之亦然,对于选项 3。希望这会有所帮助。

import pandas as pd
import numpy as np
daysOfWeek = ['Sun','Mon','Tues','Weds','Thurs','Fri','Sat', 'Week', 'Total']

df1 = pd.DataFrame()

for i in range(0, len(daysOfWeek)):
    #create array with random numbers
    df1[daysOfWeek[i]] = np.random.randint(0,10,500)
print(df1.head())

第一个选项:100 个循环,3 个中的最佳:每个循环 1.01 毫秒

%%timeit -n 100
df2 = pd.concat(
    [df1.Sun,df1.Mon, 
    df1.Tues, df1.Weds,
    df1.Thurs, df1.Fri,
    df1.Sat], axis=1)

第二个选项:100 个循环,3 个中最好的:每个循环 743 µs

df2 = df1.drop(['Week', 'Total'], axis=1)

第三种选择:100 次循环,3 次中的最佳:每个循环 838 µs

df2 = df1[['Sun','Mon','Tues','Weds','Thurs','Fri','Sat']]

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多