2015-10-10 99 views
0

作为行索引值和列名称的函数,创建熊猫数据框的最佳方法是什么?创建一个数据框作为行索引值和列名的函数?

所以对于数据帧,其中在X索引,列在Y,每个值将是一些F(X,Y),其中x在X和Y在Y(例如可以是索引和列名的串联)

我知道我可以写一个循环来做到这一点,但是熊猫有更快的方法吗?

谢谢!

回答

2

你可以用一个列表理解为一个列表的列表准备的值,然后列出清单传递给pd.DataFrame

import pandas as pd 
rows = ['1','2','3'] 
cols = ['X','Y'] 

df = pd.DataFrame(([col+row for col in cols] for row in rows), 
        index=rows, columns=cols) 

产量

X Y 
1 X1 Y1 
2 X2 Y2 
3 X3 Y3 

,当然你可以通过调用任意函数代替col+rowf

df = pd.DataFrame(([f(row, col) for col in cols] for row in rows), 
        index=rows, columns=cols) 

如果rows和/或cols很大,则列表列表可能需要大量内存。为每个细胞调用f可能需要一些时间。根据f,创建df的方法可能会更快/更少占用内存。 例如,来连接你可以使用np.char.addnp.meshgrid的行和列标签:

import numpy as np 
rows = ['1','2','3'] 
cols = ['X','Y'] 

df = pd.DataFrame(np.char.add(*np.meshgrid(cols, rows, sparse=True, indexing='xy')), 
        index=rows, columns=cols) 

产生同样的结果。

这将创建NumPy数组而不创建列表的临时列表,从而节省内存。由于np.char.add以向量化的方式创建了结果NumPy数组,因此rowscols很大,所以得出的结果比为每个单元计算col+row(以Python)更快。

+0

谢谢这是有帮助的。我没有尝试进行字符串连接 - f(x,y)将调用difflib来查看x和y字符串的相似程度。我基本上是通过摆脱那些可能是重复的东西来清理一长串名字。所以我想问题是调用外部函数的最有效方法是什么? –

相关问题