Python Панды продолжают группировать после применения - PullRequest
0 голосов
/ 16 января 2019

У меня есть датафрейм Pandas, похожий на этот

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

Теперь моя проблема в том, что Pandas дважды вызывает метод apply для первой группы, как упоминалось здесь , здесь и в документах . Таким образом, файл для первой группы будет храниться дважды. Есть ли способ избежать этого или у вас есть предложения по другому подходу? Можно ли сохранить группировку после применения метода?

Привет

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы можете loop by groupby object, чтобы избежать вызова первой группы дважды:

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

Sample

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
0 голосов
/ 16 января 2019

Почему бы не поставить

pd.to_csv(...)

после

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

вместо внутри my_filter_function? Таким образом вы избежите влияния поведения метода apply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...