繁体   English   中英

Pandas:根据另一列的值从列中提取值,并分成单独的数据帧

[英]Pandas: extract values from column, according to value of another column, and separate into separate dataframes

我有一个按日期索引的数据框,其中包含泛洪大小(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)来分离数据,以便给出两个与洪水相关的单独的降水数据集洪水。

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

谢谢!

使用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

groupby

我们可以通过迭代groupby通过的布尔评估分组后的对象Size0或没有。 当我们将其分配给其他名称( 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

========================================

您可以创建数据帧字典:

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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM