키별로 groupby 객체의 해당 groupby 데이터 프레임에 어떻게 액세스합니까?
다음과 같은 그룹별로 :
rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
'B': rand.randn(6),
'C': rand.randint(0, 20, 6)})
gb = df.groupby(['A'])
키와 그룹을 얻기 위해 반복 할 수 있습니다.
In [11]: for k, gp in gb:
print 'key=' + str(k)
print gp
key=bar
A B C
1 bar -0.611756 18
3 bar -1.072969 10
5 bar -2.301539 18
key=foo
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
키로 그룹에 액세스하고 싶습니다.
In [12]: gb['foo']
Out[12]:
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
그러나 내가 그렇게하려고하면 원하는 DataFrame에 해당하는 메서드가없는 gb[('foo',)]
이상한 pandas.core.groupby.DataFrameGroupBy
객체가 생깁니다.
내가 생각할 수있는 최선은 :
In [13]: def gb_df_key(gb, key, orig_df):
ix = gb.indices[key]
return orig_df.ix[ix]
gb_df_key(gb, 'foo', df)
Out[13]:
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
그러나 팬더가 보통 이런 것들에 얼마나 좋은지 고려하면 이것은 불쾌합니다.
이 작업을 수행하는 기본 제공 방법은 무엇입니까?
답변
다음 get_group
방법을 사용할 수 있습니다 .
In [21]: gb.get_group('foo')
Out[21]:
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
참고 : 이것은 모든 그룹에 대한 모든 하위 데이터 프레임의 중간 사전 / 사본을 만들 필요가 없으므로을 사용하여 순진 사전을 만드는 것보다 훨씬 메모리 효율적입니다 dict(iter(gb))
. 이는 groupby 객체에서 이미 사용 가능한 데이터 구조를 사용하기 때문입니다.
그룹화를 사용하여 다른 열을 선택할 수 있습니다.
In [22]: gb[["A", "B"]].get_group("foo")
Out[22]:
A B
0 foo 1.624345
2 foo -0.528172
4 foo 0.865408
In [23]: gb["C"].get_group("foo")
Out[23]:
0 5
2 11
4 14
Name: C, dtype: int64
답변
Python for Data Analysis의 Wes McKinney (팬더 작가)는 다음과 같은 레시피를 제공합니다.
groups = dict(list(gb))
키가 그룹 레이블이고 값이 DataFrames 인 사전을 반환합니다.
groups['foo']
당신이 찾고있는 것을 산출 할 것입니다 :
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
답변
오히려
gb.get_group('foo')
나는 사용하는 것을 선호합니다 gb.groups
df.loc[gb.groups['foo']]
이 방법으로 여러 열을 선택할 수도 있기 때문입니다. 예를 들면 다음과 같습니다.
df.loc[gb.groups['foo'],('A','B')]
답변
gb = df.groupby(['A'])
gb_groups = grouped_df.groups
선택적 groupby 객체를 찾고 있다면 gb_groups.keys ()를 수행하고 원하는 key를 다음 key_list에 입력하십시오.
gb_groups.keys()
key_list = [key1, key2, key3 and so on...]
for key, values in gb_groups.iteritems():
if key in key_list:
print df.ix[values], "\n"
답변
GroupBy obj의 일부 멤버를 샘플링하는 방법을 찾고있었습니다.이 작업을 수행하려면 게시 된 질문을 해결해야했습니다.
그룹 별 객체 생성
grouped = df.groupby('some_key')
N 개의 데이터 프레임을 선택하고 지수를 가져옵니다.
sampled_df_i = random.sample(grouped.indicies, N)
그룹을 잡아
df_list = map(lambda df_i: grouped.get_group(df_i), sampled_df_i)
선택적으로 모든 것을 단일 데이터 프레임 객체로 되돌립니다.
sampled_df = pd.concat(df_list, axis=0, join='outer')