0

したがって、かなり大きなデータセットが次のようになります。

data=[['O', '3C-1', '100', '100', '67.848600000000005', '0.00021722920782039196', '3.4565635', '1.3', '0.7', '0.38673693', '0.618034', '30.0', '-2.0097724299999977'],
['I', '1C-2', '150', '150', '101.77200000000001', '9.6548022169817182e-05', '3.46454077', '1.3', '0.7', '-1.77373911', '-1.70838786', '30.0', '-1.8860072499999994'],
['O', '3C-2', '250', '250', '169.62', '3.4757287981134192e-05', '3.48710222', '1.3', '0.7', '-6.81997504', '-3.94866255', '30.0', '-1.5686071800000005'],
['O', '3C-2', '500', '500', '339.23899999999998', '8.6893732236788835e-06', '3.23954068', '1.3', '0.7', '19.05924395', '2.15260466', '30.0', '-1.0255009299999993']]

次に、次のような定義があります。

def mdata(a=None,b=None,c=None,d=None):
    filt=[]
    for num,a in enumerate([a,b,c,d]):
        if a==None: continue
        filt.append([a,num])
    data=creader(open(stuff.csv'))
    for a,num in filt:
        data=[x for x in data if a in x[num]]
    for a in data: print a

a、b、c、dは、データセットの最初の4列を処理します。したがって、mdata()を呼び出すと、データセット全体が返されますが、がdata(a ='O')を指定すると、最初の列にOが含まれるデータのみが返されます。

これは、列cとdを除いて正常に機能します。これらはintである必要があるためです。たとえば、mdata(c = '10')を指定すると、3番目の列に10が含まれるすべてのデータセット(100、5103など)が取得されます。ここで条件を設定して、文字列を条件付きで検索したり、問題のデータをintに変換したりできますが、条件を正しく取得できず、これを行うには非常に貧弱な方法のようです。これをどのように改善できますか?

4

2 に答える 2

2

サブクラス化listして、列名を各要素のサブ要素にマップする機能を追加してから、フィルタリングメカニズムを提供できます。len以下は通常のリストと同じように機能しますが、リストに要素が含まれると予想される列数と同じ数の要素がない場合は要素を追加できず、次のことが可能になります。を使用して、フィルタリングされた要素を繰り返し処理しますfiltered_by()。イニシャライザに指定された列名は、への有効な引数名になりfiltered_by()ます。

class FilterableList(list):

    def __init__(self, column_names, initial_data=None):
        if initial_data is not None:
            list.__init__(self, initial_data)
        else:
            list.__init__(self)
        self.column_names = column_names

    def __setitem__(self, index, value):
        if len(value) != len(self.column_names):
            raise ValueError('Rows must have the correct number of columns.')
        list.__setitem__(self, index, value)

    def append(self, value):
        if len(value) != len(self.column_names):
            raise ValueError('Rows must have the correct number of columns.')
        list.append(self, value)

    def extend(self, values):
        for value in values:
            self.append(value)

    def filtered_by(self, **filters):
        try:
            filters = [(self.column_names.index(filter[0]), filter[1]) for filter in filters.iteritems()]
        except ValueError:
            raise ValueError('Tried to apply filter with invalid column name.')
        for row in self:
            for index, value in filters:
                if row[index] != value:
                    continue
                yield row

data = FilterableList(('a', 'b', 'c', 'd'))
data.extend(((1,2,3,4), (2,2,5,6), (3,4,7,8)))
for row in data.filtered_by(b=2, c=5):
    print row
于 2013-01-18T18:32:19.867 に答える
2

パンダライブラリをご覧になることを強くお勧めします。

これがとても簡単なことです。

まず、データをロードします。

>>> data = pd.read_csv("op.csv", index_col=False)
>>> data
   0     1    2    3         4         5         6    7    8          9        10  11        12
0  O  3C-1  100  100   67.8486  0.000217  3.456564  1.3  0.7   0.386737  0.618034  30 -2.009772
1  I  1C-2  150  150  101.7720  0.000097  3.464541  1.3  0.7  -1.773739 -1.708388  30 -1.886007
2  O  3C-2  250  250  169.6200  0.000035  3.487102  1.3  0.7  -6.819975 -3.948663  30 -1.568607
3  O  3C-2  500  500  339.2390  0.000009  3.239541  1.3  0.7  19.059244  2.152605  30 -1.025501

列を選択し、次の値を見つけます"O"

>>> data['0']
0    O
1    I
2    O
3    O
Name: 0
>>> data['0'] == "O"
0     True
1    False
2     True
3     True
Name: 0

それらの行のみを取得します。

>>> data[data['0'] == "O"]
   0     1    2    3         4         5         6    7    8          9        10  11        12
0  O  3C-1  100  100   67.8486  0.000217  3.456564  1.3  0.7   0.386737  0.618034  30 -2.009772
2  O  3C-2  250  250  169.6200  0.000035  3.487102  1.3  0.7  -6.819975 -3.948663  30 -1.568607
3  O  3C-2  500  500  339.2390  0.000009  3.239541  1.3  0.7  19.059244  2.152605  30 -1.025501

最初の値で行をグループ化します。

>>> for val, rows in data.groupby("0"):
...     print val
...     print rows
...     
I
   0     1    2    3        4         5         6    7    8         9        10  11        12
1  I  1C-2  150  150  101.772  0.000097  3.464541  1.3  0.7 -1.773739 -1.708388  30 -1.886007
O
   0     1    2    3         4         5         6    7    8          9        10  11        12
0  O  3C-1  100  100   67.8486  0.000217  3.456564  1.3  0.7   0.386737  0.618034  30 -2.009772
2  O  3C-2  250  250  169.6200  0.000035  3.487102  1.3  0.7  -6.819975 -3.948663  30 -1.568607
3  O  3C-2  500  500  339.2390  0.000009  3.239541  1.3  0.7  19.059244  2.152605  30 -1.025501

等々:

>>> data[data['0'] == "O"]["4"]
0     67.8486
2    169.6200
3    339.2390
Name: 4
>>> data[data['0'] == "O"]["4"].mean()
192.23586666666665

それは私の人生をとても楽にしてくれました。

于 2013-01-18T21:47:31.943 に答える