我有一个处理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]和这些都有可能为每个不同df在df_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
我正在处理一个包含2,000,000行的大型记录文件.每行包含有关电子邮件的功能和[0,1]分别用于非垃圾邮件或垃圾邮件的二进制标签.
我想转换的所有功能,如email_type这需要对值从[1,10]二进制矩阵.
这可以使用pd.get_dummies(),从一列特征创建二进制矩阵来完成.
这完全适用于数据的一个小子样本,比如10,000行.但是,对于100,000+行,我看到错误Killed:9.
为解决这个问题,我尝试了以下方法:
脚步:
numpyp.array_split()码:
# 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) 我正在通过将分类变量转换为二进制矩阵来预处理机器学习分类任务的数据,主要是使用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) 我有以下代码设置,可以调用 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) 尽管像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) 我试图将数据帧中的每个值绑定在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 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())) …