小编jfi*_*ive的帖子

为什么DataFrame的连接速度会成倍增长?

我有一个处理DataFrame的函数,主要是将数据处理成桶,在特定列中使用创建二进制矩阵的特征pd.get_dummies(df[col]).

为了避免一次使用此函数处理我的所有数据(内存不足并导致iPython崩溃),我使用以下方法将大型DataFrame分解为块:

chunks = (len(df) / 10000) + 1
df_list = np.array_split(df, chunks)
Run Code Online (Sandbox Code Playgroud)

pd.get_dummies(df)会自动创建一个基于内容的新栏目df[col]和这些都有可能为每个不同dfdf_list.

处理完毕后,我使用以下方法将DataFrame连接在一起:

for i, df_chunk in enumerate(df_list):
    print "chunk", i
    [x, y] = preprocess_data(df_chunk)
    super_x = pd.concat([super_x, x], axis=0)
    super_y = pd.concat([super_y, y], axis=0)
    print datetime.datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)

第一个块的处理时间是完全可以接受的,然而,它每块增长!这与它没有关系,preprocess_data(df_chunk)因为没有理由增加它.由于呼叫的结果,是否会增加时间pd.concat()

请参阅下面的日志:

chunks 6
chunk 0
2016-04-08 00:22:17.728849
chunk 1
2016-04-08 00:22:42.387693 
chunk 2
2016-04-08 00:23:43.124381
chunk 3
2016-04-08 00:25:30.249369
chunk 4
2016-04-08 00:28:11.922305
chunk 5
2016-04-08 00:32:00.357365 …
Run Code Online (Sandbox Code Playgroud)

python performance concatenation processing-efficiency pandas

27
推荐指数
2
解决办法
1万
查看次数

Python Pandas:将2,000,000个DataFrame行转换为二进制矩阵(pd.get_dummies())而没有内存错误?

我正在处理一个包含2,000,000行的大型记录文件.每行包含有关电子邮件的功能和[0,1]分别用于非垃圾邮件或垃圾邮件的二进制标签.

我想转换的所有功能,如email_type这需要对值从[1,10]二进制矩阵.

这可以使用pd.get_dummies(),从一列特征创建二进制矩阵来完成.

这完全适用于数据的一个小子样本,比如10,000行.但是,对于100,000+行,我看到错误Killed:9.

为解决这个问题,我尝试了以下方法:

脚步:

  1. 使用将DataFrame拆分为10,000行的块 numpyp.array_split()
  2. 为10,000行的每个DataFrame创建二进制矩阵
  3. 将它们附加到DataFrame列表中
  4. 将这些DataFrame连接在一起(我这样做是为了保留每个块将包含的列的差异)

码:

# break into chunks
chunks = (len(df) / 10000) + 1
df_list = np.array_split(df, chunks)
super_x = []
super_y = []

# loop through chunks
for i, df_chunk in enumerate(df_list):
    # preprocess_data() returns x,y (both DataFrames)
    [x, y] = preprocess_data(df_chunk)
    super_x.append(x)
    super_y.append(y)

# vertically concatenate DataFrames
super_x_mat = pd.concat(super_x, axis=0).fillna(0)
super_y_mat = …
Run Code Online (Sandbox Code Playgroud)

python performance numpy bigdata pandas

9
推荐指数
1
解决办法
1362
查看次数

Python Pandas:为什么numpy比Pandas的列分配要快得多?我可以进一步优化吗?

我正在通过将分类变量转换为二进制矩阵来预处理机器学习分类任务的数据,主要是使用pd.get_dummies().这适用于单个Pandas DataFrame列,并输出一个新的DataFrame,其行数与原始列中唯一数量的分类变量的原始和宽度相同.

我需要为形状的DataFrame完成这个:(3,000,000 x 16)它输出一个形状的二进制矩阵:(3,000,000 x 600).

在此过程中,转换为二进制矩阵的步骤pd.get_dummies()非常快,但使用输出矩阵的分配要慢得多pd.DataFrame.loc[].由于我必须切换到节电直到np.ndarray这是快,我只是想知道为什么?(请参阅问题底部的终端输出进行时间比较)

nb正如评论中指出的那样,我可以pd.get_dummies()在整个框架上完成所有工作.但是,有些列需要定制的预处理,即:放入存储桶.要处理的最难处理的列是一个包含一串标记的列(由,or 分隔,,必须像这样处理:df[col].str.replace(' ','').str.get_dummies(sep=',').此外,预处理的训练集和测试集需要相同的列集(继承自all_cols),因为它们可能一旦它们被分解成矩阵,就不具有相同的特征.

请参阅以下代码了解每个版本

DataFrame版本:

def preprocess_df(df):
    with open(PICKLE_PATH + 'cols.pkl', 'rb') as handle:
        cols = pickle.load(handle)

    x = np.zeros(shape=(len(df),len(cols)))
    # x = pd.DataFrame(columns=all_cols)

    for col in df.columns:
        # 1. make binary matrix
        df_col = pd.get_dummies(df[col], prefix=str(col))

        print "Processed: ", col,  datetime.datetime.now()

        # 2. assign each value …
Run Code Online (Sandbox Code Playgroud)

python indexing numpy pandas

7
推荐指数
1
解决办法
833
查看次数

Python Pandas,从 .groupby().apply() 中的组中切片行

我有以下代码设置,可以调用 groupBy 并应用于 Python Pandas DataFrame。

奇怪的是,我无法按行对分组数据进行切片(例如df.loc[2:5]),而不完全破坏输出(如调试中所示),如何删除行并得到所需的输出?

任何帮助将不胜感激,我正在一个具有更复杂功能的更大示例上运行它,但已经查明了行切片的问题!

代码:

import pandas as pd
df = pd.DataFrame({'one' : ['AAL', 'AAL', 'AAPL', 'AAPL'], 'two' : [1, 2, 3, 4]})

def net_func(df):
    df_res = daily_func(df, True)
    df_res_valid = daily_func(df, False)
    df_merge = pd.merge(df_res, df_res_valid)
    return df_merge

def daily_func(df, bool_param):

#     df.drop(df.head(1).index, inplace=True)
#     df = df[1:1]
#     df.iloc[1:1,:]
#     df.loc[1:1,:]


    if bool_param:
        df['daily'+str(bool_param)] = 1
    else:
        df['daily'+str(bool_param)] = 0    
    return df

print df.groupby('one').apply(net_func)
Run Code Online (Sandbox Code Playgroud)

电流输出:

         one  two  dailyTrue  dailyFalse
one                                     
AAL  0 …
Run Code Online (Sandbox Code Playgroud)

python group-by slice dataframe pandas

6
推荐指数
1
解决办法
2万
查看次数

Pandas DataFrame能否有效地计算PMI(Pointwise Mutual Information)?

尽管像Scikit-learn这样的库提供了整体互信息度量(通过直方图),但我已经环顾四周并且还没有找到用于计算Pointwise 互信息(Wiki PMI)的框架或现有代码的简单方法.这是在Python和熊猫的背景下!

我的问题:

我有一个DataFrame,每行有一系列[x,y]示例,并希望根据公式(或更简单的公式)计算一系列PMI值:

PMI(x, y) = log( p(x,y) / p(x) * p(y) )

到目前为止,我的方法是:

def pmi_func(df, x, y):
    df['freq_x'] = df.groupby(x).transform('count')
    df['freq_y'] = df.groupby(y).transform('count')
    df['freq_x_y'] = df.groupby([x, y]).transform('count')
    df['pmi'] = np.log( df['freq_x_y'] / (df['freq_x'] * df['freq_y']) )
Run Code Online (Sandbox Code Playgroud)

这会给出有效和/或有效的计算吗?

样本I/O:

x  y  PMI
0  0  0.176
0  0  0.176
0  1  0
Run Code Online (Sandbox Code Playgroud)

python entropy dataframe pandas

3
推荐指数
1
解决办法
4292
查看次数

Python Pandas Dataframe:将数据归一化到0.01到0.99之间?

我试图将数据帧中的每个值绑定在0.01和0.99之间

我使用以下方法成功地将0到1之间的数据标准化:.apply(lambda x: (x - x.min()) / (x.max() - x.min()))如下:

df = pd.DataFrame({'one' : ['AAL', 'AAL', 'AAPL', 'AAPL'], 'two' : [1, 1, 5, 5], 'three' : [4,4,2,2]})

df[['two', 'three']].apply(lambda x: (x - x.min()) / (x.max() - x.min()))

df
Run Code Online (Sandbox Code Playgroud)

现在我想绑定0.01到0.99之间的所有值

这是我尝试过的:

def bound_x(x):
    if x == 1:
        return x - 0.01
    elif x < 0.99:
        return x + 0.01

df[['two', 'three']].apply(bound_x)
Run Code Online (Sandbox Code Playgroud)

df

但是我收到以下错误:

ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', …
Run Code Online (Sandbox Code Playgroud)

python normalization dataframe pandas

2
推荐指数
1
解决办法
3022
查看次数

Python Pandas:如何从列表列创建二进制矩阵?

我有一个Python Pandas DataFrame,如下所示:

      1
0  a, b
1     c
2     d
3     e
Run Code Online (Sandbox Code Playgroud)

a, b 是代表用户功能列表的字符串

如何将其转换为用户功能的二进制矩阵,如下所示:

     a    b    c    d    e
0    1    1    0    0    0
1    0    0    1    0    0
2    0    0    0    1    0
3    0    0    0    0    1
Run Code Online (Sandbox Code Playgroud)

我看到了一个类似的问题,即用熊猫从一列创建布尔矩阵,但是该列不包含列表项。

我已经尝试过这些方法,有没有办法将两者合并:

pd.get_dummies()

pd.get_dummies(df[1])


   a, b  c  d  e
0     1  0  0  0
1     0  1  0  0
2     0  0  1  0
3     0  0  0  1
Run Code Online (Sandbox Code Playgroud)

df[1].apply(lambda x: pd.Series(x.split())) …

python sparse-matrix dataframe pandas binary-matrix

1
推荐指数
1
解决办法
3240
查看次数