例如,我有这样一个函数,它提取项目的名称并标记该组的长度:
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
原始数据框中的每一行现在都在不同的行中被打破。为什么?
答案 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
print (df.groupby("id_").size().reset_index(name='count').to_csv(header=False, index=False, sep=' '))