使用python-pandas应用函数时如何获取groupby项的名称?

时间:2016-06-24 05:59:19

标签: python pandas

例如,我有这样一个函数,它提取项目的名称并标记该组的长度:

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))) 

提前谢谢!

编辑:

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

原始数据框中的每一行现在都在不同的行中被打破。为什么?

1 个答案:

答案 0 :(得分:1)

我认为GroupBy.apply存在问题,如果你想使用函数写入文件,因为第一组是两次调用:

Docs

  

警告

     

在当前实现中,在第一个组上应用调用func两次,以确定它是否可以采用快速或慢速代码路径。如果func有副作用,这可能会导致意外行为,因为它们将对第一组生效两次。

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

我认为您可以size使用to_csv

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