我有一个与此相似的熊猫数据框
|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))
我现在的问题是,熊猫在here,here和docs中提到的第一组上两次调用了apply方法。因此,第一组的文件将存储两次。有什么办法可以避免这种情况,或者您对其他方法有什么建议吗?应用方法之后是否可以保留分组?
致谢
答案 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