4

次のような DataFrame があるとします。

In [7]: source = pd.DataFrame([['amazon.com', 'correct', 'correct'], ['amazon.com', 'incorrect', 'correct'], ['walmart.com', 'incorrect', 'correct'], ['walmart.com', 'incorrect', 'incorrect']], columns=['domain', 'price', 'product'])

In [8]: source
Out[8]:
        domain      price    product
0   amazon.com    correct    correct
1   amazon.com  incorrect    correct
2  walmart.com  incorrect    correct
3  walmart.com  incorrect  incorrect

domainそれぞれ、 と の回数price == 'correct'を数えたいと思います。つまり、出力を次のように表示したいのですが、price == 'incorrect'product

        domain      key      value  count
0   amazon.com    price    correct      1
1   amazon.com    price  incorrect      1
2   amazon.com  product    correct      2
3  walmart.com    price  incorrect      2
4  walmart.com  product    correct      1
5  walmart.com  product  incorrect      1

どうすればいいですか?

4

2 に答える 2

7

ネストされた適用がそれを行います

In [24]: source.groupby('domain').apply(lambda x: 
                          x[['price','product']].apply(lambda y: y.value_counts())).fillna(0)

Out[24]: 
                       price  product
domain                               
amazon.com  correct        1        2
            incorrect      1        0
walmart.com correct        0        1
            incorrect      2        1
于 2013-07-19T23:40:34.600 に答える
0
In [17]: %paste
    (
      pd.melt(source, id_vars=['domain'], value_vars=['price', 'product'])
      .groupby(['domain', 'variable', 'value'])
      .size()
      .reset_index()
      .rename(columns={'variable': 'key', 0: 'count'})
    )

## -- End pasted text --
Out[17]:
        domain      key      value  count
0   amazon.com    price    correct      1
1   amazon.com    price  incorrect      1
2   amazon.com  product    correct      2
3  walmart.com    price  incorrect      2
4  walmart.com  product    correct      1
5  walmart.com  product  incorrect      1
于 2013-07-19T23:38:36.780 に答える