应用后,Python Pandas继续分组

时间:2019-01-16 10:09:38

标签: python pandas dataframe pandas-groupby

我有一个与此相似的熊猫数据框

|Ind| C1 | C2 |....| Cn |
|-----------------------|
| 1 |val1| AE |....|time|
|-----------------------|
| 2 |val2| FB |....|time|
|-----------------------|
|...|....| .. |....| ...|
|-----------------------|
| n |valn| QK |....|time|

我必须按列C2对其进行分组,并对每个组进行一些过滤,并将结果存储在每个组的单独文件中。

Grouped Dataframe:

Subset 1:

|Ind| C1 | C2 |....| Cn |
|-----------------------|
| 1 |val1| AE |....|time|
|-----------------------|
| 2 |val2| AE |....|time|
|-----------------------|
|...|....| .. |....| ...|
|-----------------------|
| n |valn| AE |....|time|

Subset 2

|Ind| C1 | C2 |....| Cn |
|-----------------------|
| 1 |val1| FB |....|time|
|-----------------------|
| 2 |val2| FB |....|time|
|-----------------------|
|...|....| .. |....| ...|
|-----------------------|
| n |valn| FB |....|time|


and so on.

我目前的方法与此类似

def my_filter_function(self, df):
   result = df[df["C1"].notna() & df["Cn"] != 'Some value']
   pd.to_csv(...)


df = pd.read_csv(...)

df.groupby("C2").apply(lambda x: self.my_filter_function(x))

我现在的问题是,熊猫在hereheredocs中提到的第一组上两次调用了apply方法。因此,第一组的文件将存储两次。有什么办法可以避免这种情况,或者您对其他方法有什么建议吗?应用方法之后是否可以保留分组?

致谢

2 个答案:

答案 0 :(得分:0)

为什么不放

pd.to_csv(...)

之后

df = df.groupby("C2").apply(lambda x: self.my_filter_function(x))

而不是在my_filter_function内部?这样,您可以避免apply方法行为的影响。

答案 1 :(得分:0)

您可以通过groupby对象loop来避免调用第一组两次:

for name, group in df.groupby("C2"):
    result = group[group["C1"].notna() & (group["Cn"] != 'Some value')]
    result.to_csv(...)

示例

df = pd.DataFrame({
         'D':[1,3,5,7,1,0],
         'E':[5,3,6,9,2,4],
         'C2':list('aaabbb')
})

for name, group in df.groupby("C2"):
    print (group)

   D  E C2
0  1  5  a
1  3  3  a
2  5  6  a
   D  E C2
3  7  9  b
4  1  2  b
5  0  4  b