我有一个按日期索引的数据框,其中包含洪水大小(0-3)和降水量(ppt)的列:
Size ppt
date
2017-09-11 0.0 0.000000
2017-09-12 0.0 0.000000
2017-09-13 0.0 0.000000
2017-09-14 1.0 34.709998
2017-09-15 0.0 0.000000
2017-09-16 0.0 0.000000
2017-09-17 0.0 0.000000
2017-09-18 0.0 0.600000
2017-09-19 3.0 157.439998
我需要根据是否发生洪灾('大小'= 1,2或3)或不发生洪灾('大小'= 0)来分离数据,以便给我两套独立的降水数据洪水或没有洪水。
我很欣赏这可能是很基本的,但是我似乎找不到正确的答案...
谢谢!
答案 0 :(得分:2)
将boolean indexing
与~
的布尔掩码求反:
mask = df['Size'].eq(0)
#alternative
#mask = df['Size'] == 0
df1 = df[~mask]
df2 = df[mask]
编辑:
对于多个布尔掩码,请使用:
m1 = df['Size'].eq(0)
m2 = df['ppt'].eq(0)
#alternative
#m1 = df['Size'] == 0
#m2 = df['ppt'] == 0
SizePos = df[m1 & m2]
dSizeZero_PptPosf2 = df[m1 & ~m2]
SizeZero_PptZero = df[~m1]
print (SizePos)
Size ppt
date
2017-09-11 0.0 0.0
2017-09-12 0.0 0.0
2017-09-13 0.0 0.0
2017-09-15 0.0 0.0
2017-09-16 0.0 0.0
2017-09-17 0.0 0.0
print (dSizeZero_PptPosf2)
Size ppt
date
2017-09-18 0.0 0.6
print (SizeZero_PptZero)
date
2017-09-14 1.0 34.709998
2017-09-19 3.0 157.439998
答案 1 :(得分:2)
groupby
在对groupby
是否为Size
的布尔值进行分组之后,我们可以遍历0
对象。当我们将其分配给其他名称(df1, df2 = ...
)时,结果可迭代项将分为两部分。
df1, df2 = (d for _, d in df.groupby(df.Size.eq(0)))
打印它们以查看
print(df1, df2, sep='\n\n')
Size ppt
date
2017-09-14 1.0 34.709998
2017-09-19 3.0 157.439998
Size ppt
date
2017-09-11 0.0 0.0
2017-09-12 0.0 0.0
2017-09-13 0.0 0.0
2017-09-15 0.0 0.0
2017-09-16 0.0 0.0
2017-09-17 0.0 0.0
2017-09-18 0.0 0.6
出于解释目的
for name, d in df.groupby(df.Size.eq(0)):
print(name, d, '=' * 40, sep='\n\n')
False
Size ppt
date
2017-09-14 1.0 34.709998
2017-09-19 3.0 157.439998
========================================
True
Size ppt
date
2017-09-11 0.0 0.0
2017-09-12 0.0 0.0
2017-09-13 0.0 0.0
2017-09-15 0.0 0.0
2017-09-16 0.0 0.0
2017-09-17 0.0 0.0
2017-09-18 0.0 0.6
========================================
答案 2 :(得分:1)
您可以创建数据框字典:
dfs = dict(tuple(df.groupby(np.where(df['Size'].eq(0), 'ppt_negative', 'ppt_positive'))))
这种方法的好处是您可以显式链接相关的数据结构,这可能有助于后续的操作,可移植性等。
结果:
{'ppt_negative': date Size ppt
0 2017-09-11 0.0 0.0
1 2017-09-12 0.0 0.0
2 2017-09-13 0.0 0.0
4 2017-09-15 0.0 0.0
5 2017-09-16 0.0 0.0
6 2017-09-17 0.0 0.0
7 2017-09-18 0.0 0.6,
'ppt_positive': date Size ppt
3 2017-09-14 1.0 34.709998
8 2017-09-19 3.0 157.439998}
可以通过np.select
进行更精细的区分:
m1 = df['Size'].eq(0)
m2 = df['ppt'].eq(0)
conds = [m1 & m2, m1 & ~m2, ~m1]
choices = ['SizeZero_PptZero', 'SizeZero_PptPos', 'SizePos']
dfs = dict(tuple(df.groupby(np.select(conds, choices))))
结果:
{'SizePos': date Size ppt
3 2017-09-14 1.0 34.709998
8 2017-09-19 3.0 157.439998,
'SizeZero_PptPos': date Size ppt
7 2017-09-18 0.0 0.6,
'SizeZero_PptZero': date Size ppt
0 2017-09-11 0.0 0.0
1 2017-09-12 0.0 0.0
2 2017-09-13 0.0 0.0
4 2017-09-15 0.0 0.0
5 2017-09-16 0.0 0.0
6 2017-09-17 0.0 0.0}