2015-10-10 103 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字符串的相似程度。我基本上是通過擺脫那些可能是重複的東西來清理一長串名字。所以我想問題是調用外部函數的最有效方法是什麼? –

相關問題