0

この形のデータを分析しようとしています...

date     | result | test
----------------------------
10-08-13 | True   | test_1
10-08-13 | True   | test_2
10-08-13 | False  | test_2
10-07-13 | True   | test_3
10-07-13 | False  | test_4
10-06-13 | True   | test_3
10-05-13 | False  | test_1

私が作成しようとしているのは、各テストの経時的な合格率の時系列です。理想的には、データを次の形式に再配置したいと思います。

date     | test_1 | test_2  | test_3  | test_4
-----------------------------------------------
10-08-13 | 50     | 70      | 55      | 100
10-08-13 | 60     | 70      | 55      | 100
10-08-13 | 30     | 70      | 55      | NaN
10-07-13 | 50     | 10      | NaN     | 100
10-07-13 | 30     | 10      | NaN     | 100
10-06-13 | 50     | 70      | Nan     | 100
10-05-13 | 50     | 70      | 55      | 100

これまでのところ、次のコードを使用してデータを再配置できました。

all_tests = data.groupby('test').size()
data_grouped = data.groupby('date')
per_test_per_day = {}

def tests_per_day(group):
    g = group.groupby('test')
    tests = g.size() 
    tests_pass = g['result'].sum()
    for d in all_tests.index:
    if d not in per_test_per_day:
        per_device_per_day[d] = []

    if d in tests:
        per_test_per_day[d].append(tests_pass[d] / tests[d] * 100)
    else:
        per_test_per_day[d].append(NaN)

data_grouped.apply(tests_per_day)

結果のデータ フレームは、インデックスが標準の整数であるため、X 軸に正しい日付がラベル付けされていないことを除いて、必要なものに近いように見えます。

Pandas と NumPy を使用して、このデータ変換を実現するためのはるかに優れた方法があると確信しています。

4

1 に答える 1

3

今考えてみると、これは次のように書かれた方がはるかにpivot_table優れています:

In [21]: df.pivot_table(values='result', cols='test', rows='date')
Out[21]: 
test      test_1  test_2  test_3  test_4
date                                    
10-05-13       0     NaN     NaN     NaN
10-06-13     NaN     NaN       1     NaN
10-07-13     NaN     NaN       1       0
10-08-13       1     0.5     NaN     NaN

In [22]: df.pivot_table(values='result', cols='test', rows='date') * 100
Out[22]: 
test      test_1  test_2  test_3  test_4
date                                    
10-05-13       0     NaN     NaN     NaN
10-06-13     NaN     NaN     100     NaN
10-07-13     NaN     NaN     100       0
10-08-13     100      50     NaN     NaN

注:デフォルトの aggfunc は mean です。これはまさにあなたが望むものです。

groupby、mean、および unstack を使用した直接的ではない方法については、この回答の編集履歴を参照してください。

于 2013-10-08T21:23:19.027 に答える