3

如何在 python 中创建一个二维表?我在一个数据集中有 2 个分类变量,并想通过创建一个 2 维表来查看这 2 个变量之间的关系。谢谢你。

4

6 回答 6

5

有一个bidict 包

>>> 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
于 2013-06-19T21:34:12.437 回答
1

您可以使用Python Cookbook上的配方 578224DoubleDict中所示的a 。

于 2013-06-19T21:40:08.230 回答
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
于 2013-06-19T21:22:04.760 回答
0

标准库中的最佳解决方案可能是,如果您的数据中等大,则使用sqlite内存数据库:http ://docs.python.org/2/library/sqlite3.html

于 2013-06-19T21:30:21.147 回答
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}}
于 2013-06-19T21:34:33.030 回答
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")

对于具有小数据集的一次性脚本以外的任何内容,毫无疑问,使用提到的一种方法会更好:)

于 2013-06-19T22:03:54.753 回答