处理非常大的数据框

Posted

技术标签:

【中文标题】处理非常大的数据框【英文标题】:Handling a very big dataframe 【发布时间】:2016-03-06 16:38:09 【问题描述】:

现在我在如何处理我的数据并将其转换为数据框时遇到了麻烦。基本上我要做的是先读取数据

data = pd.read_csv(querylog, sep=" ", header=None)

然后分组

query_group = data.groupby('Query')
ip_group = data.groupby('IP')

最后创建一个空白数据框来映射它们的值

df = pd.DataFrame(columns=query_group.groups, index=range(0, len(ip_group.groups)))

index = 0
for name, group in ip_group:
    df.set_value(index, 'IP', name)
    index += 1
df = df.set_index('IP')

for index, row in data.iterrows():
    df.set_value(row['IP'], row['Query'], 1)
    print(index)
df = df.fillna(0)

所以我的问题是 ip_group 可以达到 6000 的大小,而 query_group 可以达到 400000 这将导致我记忆中的空白数据框非常大不能处理。谁能帮我解决这个问题?任何帮助表示赞赏。

数据的示例数据框如下所示

data = pd.DataFrame(  "Query" : ["google.com", "youtube.com", "facebook.com"],
     "IP" : ["192.168.0.104", "192.168.0.103","192.168.0.104"]  )

我的预期输出应该是这样的

                google.com youtube.com  facebook.com
IP            
192.168.0.104   1          0             1
192.168.0.103   0          1             0

【问题讨论】:

是否有特殊原因使用 df.set_value() 在循环中填充 DF 而不是使用数据集/面板/系列? 你能添加数据框样本data吗? @MaxU 这是我能想到的第一个解决方案,因为 get_dummies 也会导致内存错误。非常感谢您提供的任何解决方案。 【参考方案1】:

IIUC 你可以使用get_dummies,但是没有数据是有问题的找到最佳解决方案:

df = pd.get_dummies(data.set_index('IP')['Query'])
print df.groupby(df.index).sum()

示例:

import pandas as pd

data = pd.DataFrame(  "Query" : ["a", "b", "c", "d", "a" , "b"],
     "IP" : [1,5,4,8,3,4]  )
print data  
   IP Query
0   1     a
1   5     b
2   4     c
3   8     d
4   3     a
5   4     b
#set index from column data
data = data.set_index('IP')

#get dummies from column Query
df = pd.get_dummies(data['Query'])
print df
    a  b  c  d
IP            
1   1  0  0  0
5   0  1  0  0
4   0  0  1  0
8   0  0  0  1
3   1  0  0  0
4   0  1  0  0

#groupby by index and sum columns
print df.groupby(df.index).sum()
    a  b  c  d
IP            
1   1  0  0  0
3   1  0  0  0
4   0  1  1  0
5   0  1  0  0
8   0  0  0  1

尝试将astype 转换为int8 以节省3 倍的内存:

print pd.get_dummies(data['Query']).info()
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, 192.168.0.104 to 192.168.0.104
Data columns (total 3 columns):
facebook.com    3 non-null float64
google.com      3 non-null float64
youtube.com     3 non-null float64
dtypes: float64(3)
memory usage: 96.0+ bytes

print pd.get_dummies(data['Query']).astype(np.int8).info()
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, 192.168.0.104 to 192.168.0.104
Data columns (total 3 columns):
facebook.com    3 non-null int8
google.com      3 non-null int8
youtube.com     3 non-null int8
dtypes: int8(3)
memory usage: 33.0+ bytes

print pd.get_dummies(data['Query'], sparse=True).info()
<class 'pandas.sparse.frame.SparseDataFrame'>
Index: 3 entries, 192.168.0.104 to 192.168.0.104
Data columns (total 3 columns):
facebook.com    3 non-null float64
google.com      3 non-null float64
youtube.com     3 non-null float64

【讨论】:

我想将此设置为答案,但遗憾的是,这只会导致内存错误,因为查询次数可能高达 100000,而我的 ip 数据可能高达 5000 我编辑答案,但问题是你的电脑有多少内存。 你试过get_dummies(sparse=True)吗?这应该为您提供一个稀疏数组,因为您的数据大部分为零,因此内存效率更高。 (需要熊猫版本 0.16.1) @Rob 它位于我的答案末尾的7. 行中。

以上是关于处理非常大的数据框的主要内容,如果未能解决你的问题,请参考以下文章

将自定义函数应用于 spark 数据框组

如何在R中加载和处理非常大的数据文件[关闭]

Redux - 处理非常大的状态对象

处理非常大的数据集并及时加载

避免传递数据框的最佳方法是啥?

在 python 中处理非常大的 netCDF 文件