8

次のような2つのデータフレームがあります。

rating
   BMW  Fiat  Toyota
0    7     2       3
1    8     1       8
2    9    10       7
3    8     3       9

own
   BMW  Fiat  Toyota
0    1     1       0
1    0     1       1
2    0     0       1
3    0     1       1

最終的には、ブランド別の使用率の平均評価のピボット テーブルを取得しようとしています。またはこのようなもの:

            BMW  Fiat  Toyota
Usage                        
0      8.333333    10       3
1      7.000000     2       8

私のアプローチは、次のようにデータセットをマージすることでした。

Measure  Rating                Own              
Brand       BMW  Fiat  Toyota  BMW  Fiat  Toyota
0             7     2       3    1     1       0
1             8     1       8    0     1       1
2             9    10       7    0     0       1
3             8     3       9    0     1       1

次に、評価を値、所有者を行、ブランドを列としてピボット テーブルを作成してみます。しかし、私は重要な問題に取り組み続けました。また、メジャー レベルまたはブランド レベルのスタックを解除しようとしましたが、行インデックス名をピボット キーとして使用できないようです。

私は何を間違っていますか?これに対するより良いアプローチはありますか?

4

2 に答える 2

4

私はパンダの専門家ではないので、解決策はあなたが望むよりも不器用かもしれませんが、

rating = pd.DataFrame({"BMW":[7, 8, 9, 8], "Fiat":[2, 1, 10, 3], "Toyota":[3, 8, 7,9]})
own = pd.DataFrame({"BMW":[1, 0, 0, 0], "Fiat":[1, 1, 0, 1], "Toyota":[0, 1, 1, 1]})

r = rating.unstack().reset_index(name='value')
o = own.unstack().reset_index(name='value')
res = DataFrame({"Brand":r["level_0"], "Rating": r["value"], "Own": o["value"]})
res = res.groupby(["Own", "Brand"]).mean().reset_index()
res.pivot(index="Own", columns="Brand", values="Rating")

# result
# Brand       BMW  Fiat  Toyota
# Own                          
# 0      8.333333    10       3
# 1      7.000000     2       8

あまり一般化できませんが、別の解決策( for ループを使用できますが、データフレームにどの値があるかを知る必要がありますown):

d = []
for o in (0, 1):
    t = rating[own == o]
    t["own"] = o
    d.append(t)

res = pd.concat(d).groupby("own").mean()
于 2013-10-17T20:09:38.793 に答える
3

私自身の質問に対する新しい回答があります (Roman の最初の回答に基づく)。重要なのは、必要な次元でインデックスを取得することです。例えば

rating.columns.names = ["Brand"]
rating.index.names = ["n"]
print rating

Brand  BMW  Fiat  Toyota
n                       
0        7     2       3
1        8     1       8
2        9    10       7
3        8     3       9

own.columns.names = ["Brand"]
own.index.names = ["n"]
print own

Brand  BMW  Fiat  Toyota
n                       
0        1     1       0
1        0     1       1
2        0     0       1
3        0     1       1

merged = pd.merge(own.unstack().reset_index(name="Own"), 
                  rating.unstack().reset_index(name="Rating"))
print merged

     Brand  n  Own  Rating
0      BMW  0    1       7
1      BMW  1    0       8
2      BMW  2    0       9
3      BMW  3    0       8
4     Fiat  0    1       2
5     Fiat  1    1       1
6     Fiat  2    0      10
7     Fiat  3    1       3
8   Toyota  0    0       3
9   Toyota  1    1       8
10  Toyota  2    1       7
11  Toyota  3    1       9

pivot_table次に、コマンドを使用してこれを目的の結果に変えるのは簡単です。

print merged.pivot_table(rows="Brand", cols="Own", values="Rating")

Own             0  1
Brand               
BMW      8.333333  7
Fiat    10.000000  2
Toyota   3.000000  8

そして、それが私が探していたものです。道を示してくれたRomanに再び感謝します。

于 2013-10-23T17:11:59.737 に答える