2016-06-24 1 views
1

たとえば、私はアイテムの名前を抽出し、そのグループの長さをマークし、このような機能を持っている:python-pandasで関数を適用すると、groupby項目の名前を取得するにはどうすればいいですか?

def func(name, len): 
    with open("file.txt", "a") as f: 
     f.write(name+len+"\n") 

そして、どのように私はのように、この機能を適用するために、各グループの名前を取得することができます

df.groupby("id_").apply(lambda group: func(group.name, len(group))) 

ありがとうございます!

EDIT:

def split_group_to_df(group, fullpath): 
    group.apply(lambda df: write_df_to_file(df, fullpath)) 

def write_stock_to_file(df, fullpath): 
    with open(fullpath, 'a') as fwrite: 
     if os.stat(fullpath).st_size == 0: 
      df.to_csv(fwrite, index=False) 
     else: 
      df.to_csv(fwrite, index=False, header=False) 
df = pd.read_csv("file.txt") 
df.groupby('id_').apply(lambda group: split_group_to_df(group, group.name+'.txt')) 

出力がある:

000008 
92000000 
12121 

元のデータフレームの各行は、現在異なる行に分割されます。どうして?

+0

「df」のサンプルを追加できますか? 'df = pd.DataFrame({'id _':[1,2,3,4,1,2,3,1]、 'name':[4,5,6,1,4,2] 、4,7]}) ')? 'name'は列名ですか? – jezrael

答えて

1

ファイルへの書き込みをする機能を使いたい場合は、最初のグループは二回の呼び出しであるので、私は、GroupBy.applyに問題があると思う:

Docs:現在では

警告

実装applyは最初のグループに対してfuncを2回呼び出して、高速または低速のコードパスを使用できるかどうかを判断します。 funcに副作用があると、予期しない動作につながる可能性があります。副作用があると、最初のグループで2回有効になります。

In [123]: d = pd.DataFrame({"a":["x", "y"], "b":[1,2]}) 

In [124]: def identity(df): 
    .....:  print df 
    .....:  return df 
    .....: 

In [125]: d.groupby("a").apply(identity) 
    a b 
0 x 1 
    a b 
0 x 1 
    a b 
1 y 2 
Out[125]: 
    a b 
0 x 1 
1 y 2 

ので、使用している場合:

import pandas as pd 

df = pd.DataFrame({'id_':[1,2,3,4,1,2,3,1], 
        'name':[4,5,6,1,4,2,4,7]}) 

print (df) 


def func(name, len): 
    with open("file.txt", "a") as f: 
     f.write(str(name)+str(len)+"\n") 

df.groupby("id_").apply(lambda group: func(group.name, len(group))) 

出力ファイルは、次のとおりです。

0 4 
4 4 
7 7 
Name: name, dtype: int643 
13 
22 
32 
41 

私はあなたがto_csvsizeを使用することができると思う:

print (df.groupby("id_").size().reset_index(name='count').to_csv(header=False, index=False, sep=' ')) 
+0

あなたの答えをありがとう!そして私は本当にあなたに答えて警告された問題を持っています!しかし、私はまだその理由と解決策を混同しています。あなたは私を助けてくれますか?私はすでに補助コードを追加しています。ありがとう! – user5779223

+0

私はすでに問題を解決しました。愚かな間違い。ご協力いただきありがとうございます! – user5779223

関連する問題