0

いくつかの異なる期間にわたって評価したい車両情報があり、情報を移動しながら DataFrame のさまざまな列を変更しています。私は現在と以前の期間で作業しているので、2 つを連結して一緒に作業する必要があります。

私が抱えている問題は、「時間」列をパンダのインデックスとして使用し、返されるオブジェクトが期間内の車両 (または行) の数に応じてデータフレームまたはシリーズのいずれかであるデータをループするときです。 . Series オブジェクトで DataFrame メソッドを使用しようとすると、このオブジェクト タイプの変更によりエラーが発生します。

私がやろうとしていることと受け取ったエラーを示す小さなサンプル プログラムを作成しました。これはサンプルであり、実際のコードではないことに注意してください。インデックスを使用する代わりに、期間ごとにデータを簡単にクエリしようとしましたが、それは機能しますが、必要なことには遅すぎます。

import pandas as pd

df = pd.DataFrame({
    'id' : range(44, 51),
    'time' : [99,99,97,97,96,96,100],
    'spd' : [13,22,32,41,42,53,34],
})


df = df.set_index(['time'], drop = False)

st = True

for ind in df.index.unique():

    data = df.ix[ind]

    print data

    if st:
        old_data = data
        st = False
    else:
        c = pd.concat([data, old_data])

    #do some work here

出力は次のとおりです。

  id  spd  time
time               
99    44   13    99
99    45   22    99
      id  spd  time
time               
97    46   32    97
97    47   41    97
      id  spd  time
time               
96    48   42    96
96    49   53    96
id       50
spd      34
time    100
Name: 100, dtype: int64
Traceback (most recent call last):
  File "C:/Users/m28050/Documents/Projects/fhwa/tca/v_2/code/pandas_ind.py", line 24, in <module>
    c = pd.concat([data, old_data])
  File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 873, in concat
    return op.get_result()
  File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 946, in get_result
    new_data = com._concat_compat([x.values for x in self.objs])
  File "C:\Python27\lib\site-packages\pandas\core\common.py", line 1737, in _concat_compat
    return np.concatenate(to_concat, axis=axis)
ValueError: all the input arrays must have same number of dimensions

誰かが DataFrame をループして列を更新する正しい方法を持っているか、使用する別の方法を指摘できるなら、それは素晴らしいことです。

ご協力いただきありがとうございます。

ジム

4

1 に答える 1

0

groupbyここで役立つと思います:

In [11]: spd_lt_40 = df1[df1.spd < 40]

In [12]: spd_lt_40_count = spd_lt_40.groupby('time')['id'].count()

In [13]: spd_lt_40_count
Out[13]:
time
97      1
99      2
100     1
dtype: int64

これを元の DataFrame の列に設定します。

In [14]: df1['spd_lt_40_count'] = spd_lt_40_count

In [15]: df1['spd_lt_40_count'].fillna(0, inplace=True)

In [16]: df1
Out[16]:
      id  spd  time  spd_lt_40_count
time
99    44   13    99                2
99    45   22    99                2
97    46   32    97                1
97    47   41    97                1
96    48   42    96                0
96    49   53    96                0
100   50   34   100                1
于 2013-07-08T12:34:14.630 に答える