处理非常大的数据框
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.
行中。以上是关于处理非常大的数据框的主要内容,如果未能解决你的问题,请参考以下文章