从 pandas 系列中创建三个数组

Create three arrays from pandas series

例如,我有 pandas 个这样的数据系列:

df = pd.DataFrame({'A': ['foo', 'bar', 'ololo'] * 4,
                                'B': np.random.randn(12),
                                'C': np.random.randint(0, 2, 12)})

ga = df.groupby(['A'])['C'].value_counts()

print ga
A       
bar    1    3
       0    1
foo    0    3
       1    1
ololo  0    4

我想创建三个数组,如下所示:

第一个数组

bar, foo, ololo

第二个数组(“1”的个数)

2 3 1

第三个数组('0'的个数)

2 1 3

最简单的方法是什么?

开始于:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': ['foo', 'bar', 'ololo'] * 4,
    'B': np.random.randn(12),
    'C': np.random.randint(0, 2, 12)
})

counts = df.groupby('A')['C'].value_counts()

给出(counts):

A       
bar    1    4
foo    1    4
ololo  0    3
       1    1
dtype: int64

所以,实际上我们想要取消堆叠和转置,以便 0/1 是索引,我们这样做:

reshaped = counts.unstack().T.reindex([0, 1]).fillna(0)

DSM 指出可以通过执行以下操作来避免 .reindex

reshaped = counts.unstack().T.loc[[0, 1]].fillna(0)

给出:

A  bar  foo  ololo
0    0    0      3
1    4    4      1

我们强制 .reindex 以确保它始终包含 0/1(在随机性意味着 0/1 没有出现的情况下)并强制所有列值都为 0(.fillna(0)) 在这种情况下。然后,您可以通过执行以下操作来获取数组:

arrays = reshaped.columns.values, reshaped.loc[1].values, reshaped.loc[0].values

这给你:

(array(['bar', 'foo', 'ololo'], dtype=object),
 array([ 4.,  4.,  1.]),
 array([ 0.,  0.,  3.]))