熊猫:根据另一列的值从列中提取值,并分成单独的数据框

时间:2018-09-10 10:44:49

标签: python pandas

我有一个按日期索引的数据框,其中包含洪水大小(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)来分离数据,以便给我两套独立的降水数据洪水或没有洪水。

我很欣赏这可能是很基本的,但是我似乎找不到正确的答案...

谢谢!

3 个答案:

答案 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}