2013-06-19 94 views
1

如何在Python中創建一個雙向表?我在數據集中有2個分類變量,並希望通過創建一個雙向表來查看這兩個變量之間的關係。謝謝。如何在Python中創建一個雙向表?

+0

可能重複http://stackoverflow.com/questions/6129693/python-creating-a-table –

+3

你的意思是一個雙向映射? – brice

+5

你可以給我們一個樣本數據集? – rickcnagy

回答

0

假設您不必進行任何插值,則可以使用字典。使用(x, y)元組作爲鍵,無論你的值是什麼值。舉例來說,一個簡單的2x2的表是這樣的:

___0___1___ 
0 | 0 0.5 
1 | 0.5 1 

看起來像這樣的代碼:

two_way_lookup = { 
        (0, 0) : 0, 
        (0, 1) : 0.5, 
        (1, 0) : 0.5, 
        (1, 1) : 1 
       } 
print(two_way_lookup.get((0, 1))) # prints 0.5 
+2

這看起來並不像實際迴應問題。 – Marcin

+0

Dicts只提供一種查找方式,OP要求提供雙向表格。 –

+0

@Marcin(&Ashwini)我理解「雙向表」意思是「你在查找'x'和'y'的表格,以得到一個代表這些元素組合的值。至少在我看來,它與2向查找不同,它可以在任何方向上使用鍵/值對。 「 –

5

有一個bidict package

>>> from bidict import bidict 
>>> husbands2wives = bidict({'john': 'jackie'}) 
>>> husbands2wives['john'] # the forward mapping is just like with dict 
'jackie' 
>>> husbands2wives[:'jackie'] # use slice for the inverse mapping 
'john' 

您可以使用安裝pip install bidict


編輯:爲了您的實際問題 - 如果我理解正確的話 - 我會用pandas

# data.csv 
Gender Height GPA HS GPA Seat WtFeel Cheat 
Female 64 2.60 2.63 M AboutRt No 1 
Male 69 2.70 3.72 M AboutRt No 2 
Female 66 3.00 3.44 F AboutRt No 3 
Female 63 3.11 2.73 F AboutRt No 4 
Male 72 3.40 2.35 B OverWt No 0 

In [1]: import pandas as pd 

In [2]: df = pd.read_csv('data.csv', sep = '\s') 

In [3]: grouped = df.groupby(['Gender', 'Seat']) 

In [4]: grouped.size() 
Out[4]: 
Gender Seat 
Female AboutRt 3 
Male AboutRt 1 
     OverWt  1 
dtype: int64 
+0

2列是Gender(M,F)和Body Figure(AboutRt,OverWt,UnderWt)。我想要做的就是統計AboutRt,Overwt和underWt中有多少個男性,併爲女性做同樣的事情。我希望Python中有一個類似於R中gmodels庫的包,你可以在R中創建一個交叉表。再次感謝。 –

+0

@TarekDeeb - 請編輯您的問題,填入一小部分數據樣本...... – root

+0

@TarekDeeb - 您應該看看'pandas'。添加了一個示例... – root

0

您可以創建類似兩級字典(即,包含兩個以相反順序映射相同數據的字典的字典:

>>> mappings=[(0, 6), (1, 7), (2, 8), (3, 9), (4, 10)] 
>>> view = dict(view1=dict(mappings), view2=dict(reversed(k) for k in mappings)) 
>>> view 
{'view2': {8: 2, 9: 3, 10: 4, 6: 0, 7: 1}, 
'view1': {0: 6, 1: 7, 2: 8, 3: 9, 4: 10}} 
+0

這適用於一對一的功能,但當您不假設這種情況時會有點棘手。例如:x = 4,y =( - 2,2)。 – dckrooney

0

如果你想有一個家庭自釀,靠不住的解決方案,你可以做這樣的事情:

import collections 

class BDMap: 
    def __init__(self): 
     self.x_table = {} 
     self.y_table = {} 

    def get(self, x = None, y = None): 
     if (x != None) and (y != None): 
      y_vals = self.x_table[x] 
      if (y in y_vals): 
       return (x, y) 
     elif x != None: 
      return self.x_table[x] 
     elif y != None: 
      return self.y_table[y] 

    def set(self, x, y): 
     if isinstance(x, collections.Hashable) and isinstance(y, collections.Hashable): 
      self.x_table[x] = self.x_table.get(x, list()) + [y] 
      self.y_table[y] = self.y_table.get(y, list()) + [x] 
     else: 
      raise TypeError("unhashable type") 

對於除一次性腳本之外的任何一個小的數據集,你無疑是更好與提到的方法之一,雖然:)

相關問題