![](/img/trans.png)
[英]Joining 3 separate DataFrames based off 3 common column values in 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
通过的布尔评估分组后的对象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
========================================
您可以创建数据帧字典:
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.