0

私は次のデータフレームを持っています:

data = np.random.randn(10,10)
col = list('ABCDEFGHIJ')
idx = list('ababaaccab')
df = pd.DataFrame(data, columns = col, index = idx)

df

          A         B         C         D         E         F         H  
a -0.104171 -0.872001  1.459766 -0.026101  0.474336  2.032986 -0.795409   
b  0.778402  0.965868  1.672520 -2.463641  1.024571  1.501360  1.047823   
a  0.731303 -1.314826  1.477969 -1.018818  0.539794 -0.108252  0.038276   
b -1.180857 -1.931064 -0.287966 -0.387748 -0.324306  0.146812  0.674937   
a -0.151452  0.387804  0.853088  0.610810  0.091901 -0.246471 -0.677219   
a  1.392482  1.286639 -0.607495  0.682221  0.164414 -0.496787  0.502786   
c  0.039890  0.587645  0.577257 -0.381706 -1.477829  1.165732 -1.877052   
c -1.307827 -0.370028  0.136269 -0.968533  0.830933 -0.025641 -0.497450   
a  0.990024  0.003812 -0.698894  0.674133 -0.176148 -0.184096 -1.449170   
b -1.214920 -1.123358 -0.847955 -0.464895  0.517553 -0.080168 -1.162767

また、文字を「母音」と「子音」の間で区切る pandas ドキュメントの関数も使用します。

def get_letter_type(letter):
    if letter.lower() in 'aeiou':
        return 'v'
    else:
        return 'c'

私の質問は、データフレームのインデックスから文字タイプを使用して groupby を実行するにはどうすればよいですか?

4

3 に答える 3

3

関数を に渡すと、関数groupbyはインデックスで評価されます。したがって、値がインデックスにある場合は、次のことができます。

df.groupby(get_letter_type).sum()
Out[122]: 
          A         B         C         D         E         F         G  \
c  5.504182  3.637560  2.659321  0.558187  0.206418 -1.194616  1.410917   
v  1.132699 -0.768438 -0.183739 -1.353405  1.148394 -0.668739 -1.376241   

          H         I         J  
c  3.388815 -1.086567 -2.223479  
v  0.456455 -0.904328  1.072830  

より一般的なケースでnp.vectorizeは、関数のベクトル化されたバージョンを取得するために使用できます。

import numpy as np    
get_letter_type_vectorized = np.vectorize(get_letter_type)

次に、その関数を使用して、インデックスを引数としてグループ化します(インデックス以外の入力でも機能します)。

df.groupby(get_letter_type_vectorized(df.index)).sum()

データセットが大きい場合は、独自のベクトル化バージョンを試すこともできますnp.where:

df.groupby(np.where(df.index.isin(list("aeiou")), "v", "c")).sum()

np.wherev と c の配列 ( array(['v', 'c', 'v', 'c', 'v', 'v', 'c', 'c', 'v', 'c'], dtype='<U1')) を返し、その配列に対してグループ化が行われます。

于 2016-04-30T15:59:36.450 に答える
1

設定

np.random.seed(314)
data = np.random.randn(10,10)
col = list('ABCDEFGHIJ')
idx = list('ababaaccab')
df = pd.DataFrame(data, columns = col, index = idx)


def get_letter_type(letter):
    if letter.lower() in 'aeiou':
        return 'v'
    else:
        return 'c'

解決

に文字タイプを追加してdf.index、 new を定義しますDataFrame。次に使用しますgroupby(level=1)

letter_types = df.index.to_series().apply(get_letter_type)
df_w_letter_types = df.set_index(letter_types, append=True)
letter_type_groupby = df_w_letter_types.groupby(level=1)

デモンストレーション

その後、やりたいことは何でもできます

print letter_type_groupby.sum()

          A         B         C         D         E         F         G  \
c  0.155376 -0.544616 -2.274168 -0.721236 -1.214174  0.663555  2.668149   
v -1.196059 -0.264262 -0.252973  1.178112  0.030117 -0.392086  3.503615   

          H         I         J  
c  2.951569 -3.216444  3.976823  
v -2.790688 -0.343123 -4.346544 
于 2016-04-30T15:57:42.813 に答える