57

文字列を含む列を持つ pandas データフレームがありmy_labelsます: 'A', 'B', 'C', 'D', 'E'. これらの各文字列の出現回数をカウントし、カウント数をすべてのカウントの合計で割りたいと思います。私はこのようにパンダでこれをやろうとしています:

func = lambda x: x.size() / x.sum()
data = frame.groupby('my_labels').apply(func)

このコードは、「DataFrame オブジェクトに属性 'size' がありません」というエラーをスローします。Pandasでこれを計算する関数を適用するにはどうすればよいですか?

4

5 に答える 5

53

applyシリーズではなく各値に適用する関数を取り、kwargs を受け入れます。したがって、値にはメソッドがありません.size()

おそらくこれはうまくいくでしょう:

from pandas import *

d = {"my_label": Series(['A','B','A','C','D','D','E'])}
df = DataFrame(d)


def as_perc(value, total):
    return value/float(total)

def get_count(values):
    return len(values)

grouped_count = df.groupby("my_label").my_label.agg(get_count)
data = grouped_count.apply(as_perc, total=df.my_label.count())

この.agg()メソッドは、 groupby オブジェクトのすべての値に適用される関数を受け取ります。

于 2013-03-13T01:00:05.190 に答える
9

試す:

g = pd.DataFrame(['A','B','A','C','D','D','E'])

# Group by the contents of column 0 
gg = g.groupby(0)  

# Create a DataFrame with the counts of each letter
histo = gg.apply(lambda x: x.count())

# Add a new column that is the count / total number of elements    
histo[1] = histo.astype(np.float)/len(g) 

print histo

出力:

   0         1
0             
A  2  0.285714
B  1  0.142857
C  1  0.142857
D  2  0.285714
E  1  0.142857
于 2013-03-13T01:04:34.580 に答える
7

「サイズ」の問題に関しては、サイズはデータフレームの関数ではなく、むしろプロパティです。size() を使用する代わりに、プレーンなサイズが機能するはずです

それとは別に、このような方法はうまくいくはずです

def doCalculation(df):
    groupCount = df.size
    groupSum = df['my_labels'].notnull().sum()
    
    return groupCount / groupSum

dataFrame.groupby('my_labels').apply(doCalculation)
于 2018-07-19T22:37:59.603 に答える