Python 数据帧的高效矩阵化

Python 数据帧的高效矩阵化,python,python-2.7,pandas,panel,dataframe,Python,Python 2.7,Pandas,Panel,Dataframe,我的第一个问题 我有一个熊猫数据框,看起来有点像这样: String1 String2 String3 value word1 word2 word3 5.6 word4 word5 word6 123.4 ... String1String2 (word1,word2) (word1,word5) (word4,word2) (word4,word5) ... String3 word3 5.6 0 0 0 ... word6 0 0 0 123.4 ... 这种数据帧来自一个基于大量文本

我的第一个问题

我有一个熊猫数据框,看起来有点像这样:

String1 String2 String3 value
word1 word2 word3 5.6
word4 word5 word6 123.4
...
String1String2 (word1,word2) (word1,word5) (word4,word2) (word4,word5) ...
String3
word3 5.6 0 0 0 ...
word6 0 0 0 123.4 ...
这种数据帧来自一个基于大量文本的非常长的处理链。(作为旁注,我正在接近内存限制,现在正在考虑HDFStores。)

现在我想做线性代数运算,将这个表转换成(稀疏?)面板或其他有效的数据结构,用0填充空白。也就是说,我想创建一个表,其行是String3s,列是String1 x String2对,然后对这些行执行线性代数运算。但是,我也希望能够对任何其他列执行相同的操作——即,将String1作为行,并使用String2 x String3生成列

我一直在试验面板和透视表,但它们似乎不太正确,而且它们经常会溢出内存

使用Pandas或Python(2.7)的正确方法是什么

编辑以添加此示例:

输出表将如下所示:

String1 String2 String3 value
word1 word2 word3 5.6
word4 word5 word6 123.4
...
String1String2 (word1,word2) (word1,word5) (word4,word2) (word4,word5) ...
String3
word3 5.6 0 0 0 ...
word6 0 0 0 123.4 ...
列的数量基本上是| String1 | x | String2 |。 或者,String3作为列,String1String2作为行也可以,因为我可以对列系列执行操作

进一步编辑以添加内存问题:

In [1]: import pandas as pd

In [2]: A = pd.load("file.df")

In [3]: A 
Out[3]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 18506532 entries, 0 to 18506531
Columns: 4 entries, 0 to value
dtypes: float64(1), object(3)

In [4]: B = A[A[1] == 'xyz']

In [5]: C = B.pivot_table('value', [1,2], 0)
[1]中的
:将熊猫作为pd导入
在[2]中:A=pd.load(“file.df”)
在[3]中:A
出[3]:
INT64索引:18506532个条目,0到18506531
列:4个条目,0到值
数据类型:float64(1),object(3)
在[4]中:B=A[A[1]=='xyz']
在[5]中:C=B.pivot_表('value',[1,2],0)

它在reforme.pyc中的第160行与MemoryError崩溃。这是pandas的0.11.0版。

您可以使用pivot\u表执行此操作:

In [11]: res = df.pivot_table('value', 'String3', ['String1', 'String2'])

In [12]: res
Out[12]: 
String1  word1  word4
String2  word2  word5
String3              
word3      5.6    NaN
word6      NaN  123.4

此结果可能是足够的,但是如果您想要空白列,可以使用ItRealths.Typ.

In [13]: from itertools import product

In [14]: res = res.reindex(columns=list(product(df['String1'], df['String2'])))

In [15]: res.columns.names = ['String1', 'String2']

In [16]: res
Out[16]: 
String1  word1         word4       
String2  word2  word5  word2  word5
String3                            
word3      5.6    NaN    NaN    NaN
word6      NaN    NaN    NaN  123.4
并用0填充空格:

In [17]: res.fillna(0)
Out[17]: 
String1  word1         word4       
String2  word2  word5  word2  word5
String3                            
word3      5.6      0      0    0.0
word6      0.0      0      0  123.4

注意:在0.13中,cartesian_产品将在pandas.tools.util中提供,您可以使用pivot_表:

In [11]: res = df.pivot_table('value', 'String3', ['String1', 'String2'])

In [12]: res
Out[12]: 
String1  word1  word4
String2  word2  word5
String3              
word3      5.6    NaN
word6      NaN  123.4

此结果可能是足够的,但是如果您想要空白列,可以使用ItRealths.Typ.

In [13]: from itertools import product

In [14]: res = res.reindex(columns=list(product(df['String1'], df['String2'])))

In [15]: res.columns.names = ['String1', 'String2']

In [16]: res
Out[16]: 
String1  word1         word4       
String2  word2  word5  word2  word5
String3                            
word3      5.6    NaN    NaN    NaN
word6      NaN    NaN    NaN  123.4
并用0填充空格:

In [17]: res.fillna(0)
Out[17]: 
String1  word1         word4       
String2  word2  word5  word2  word5
String3                            
word3      5.6      0      0    0.0
word6      0.0      0      0  123.4

注意:在0.13中,
cartesian_产品将在
pandas.tools.util

中提供,您能否给出所需输出的示例,例如,对于您为回答问题而编辑的示例,它现在有一个输出的表格示例。我不知道它的输出格式是否良好,但它可能会起作用。你能给出一个所需输出的示例吗?例如,对于你为回答你的问题而编辑的示例,它现在有一个输出的表格示例。我不知道它的输出格式是否很好,但它应该能做到,也许?所以,我在我的桌子上尝试了这个,它很快在实际的轴上出现了一个内存错误。我只做了表的一个子集(加载到内存中),它只有150万个值的三元组(整个表是1800万个三元组)。我实际上是在复制一个其他人在另一个环境中使用的算法来实现这一点,所以我想知道是否有一个高效的内置快捷方式,或者我必须找到一种迭代方式来实现它。它在哪一位上爆炸?我编辑这个问题是为了提供我正在做的ipython代码上下文。查看完整的回溯有帮助吗?它显然没有耗尽我电脑的全部内存。它使用了大约4GB,然后出现故障。哦,我的数据帧A的“xyz”子集,如我所说,是150万个三元组。在我的示例中,在原始问题中输入了一个拼写错误,所以修复了它。“不过,事实上,效果也是一样的。”阿萨德说不太清楚。这一部分(关于pivot_表因内存错误而崩溃)可能是一个新问题,也可能是github上的一个问题。因此,我在我的表中尝试了这一点,它很快在实际的pivot上出现了一个MemoryError。我只做了表的一个子集(加载到内存中),它只有150万个值的三元组(整个表是1800万个三元组)。我实际上是在复制一个其他人在另一个环境中使用的算法来实现这一点,所以我想知道是否有一个高效的内置快捷方式,或者我必须找到一种迭代方式来实现它。它在哪一位上爆炸?我编辑这个问题是为了提供我正在做的ipython代码上下文。查看完整的回溯有帮助吗?它显然没有耗尽我电脑的全部内存。它使用了大约4GB,然后出现故障。哦,我的数据帧A的“xyz”子集,如我所说,是150万个三元组。在我的示例中,在原始问题中输入了一个拼写错误,所以修复了它。“不过,事实上,效果也是一样的。”阿萨德说不太清楚。这一部分(关于pivot_表因内存错误而崩溃)可能是一个新问题,也可能是github上的一个问题。