繁体   English   中英

PANDAS:合并具有共同ID的数据帧

[英]PANDAS: Combining data frames with IDs in common

我有两个数据框df1和df2,每个数据框包含不同的信息和不同的长度,但共有一个“ DAY”列,尽管并不总是具有相同的值。 就上下文而言,一个数据框包含降水记录,另一个数据框包含洪水事件及其大小的记录。 我想将它们结合起来,以便我可以轻松比较与洪水事件有关的降水条件。 df1(降水)如下所示:

D   M   Y       DAY     Tpcp    MaxInt
30  9   2010    5553    20.8    2.2
1   10  2010    5554    14      1.8
2   10  2010    5555    61.8    1.8
3   10  2010    5556    30      1.2
4   10  2010    5557    68.4    1
5   10  2010    5558    10.2    1
6   10  2010    5559    82.8    2.2
7   10  2010    5560    54.6    2.2
10  10  2010    5563    11.4    1.8

df2(洪水)如下所示:

D   M   Y       DAY     Size
12  5   2009    5047    2
3   9   2009    5161    2
13  4   2010    5383    3
14  4   2010    5384    3
16  7   2010    5477    2
4   10  2010    5557    3
6   10  2010    5559    3
30  4   2011    5765    2
22  5   2011    5787    2
27  5   2011    5792    2
9   11  2011    5958    2

洪水不会全天下雨,所以我的目标是这样的,零事件发生时为零:

D   M   Y       DAY     Tpcp    MaxInt   FldSz
30  9   2010    5553    20.8    2.2      0
1   10  2010    5554    14      1.8      0
2   10  2010    5555    61.8    1.8      0
3   10  2010    5556    30      1.2      0
4   10  2010    5557    68.4    1        3      
5   10  2010    5558    10.2    1        3
6   10  2010    5559    82.8    2.2      0
7   10  2010    5560    54.6    2.2      0
10  10  2010    5563    11.4    1.8      0

同样,我认为最简单的方法是根据“ DAY”进行合并/合并。 也许这是一个非常明显的任务,如果可以的话,我很抱歉(我是新来的),但是我找不到我认为适合该问题的答案,并且想知道那里是否会有一些建议……在此先感谢您思想和贡献:)

我相信您需要pandas.join

res = df1.join(df2.set_index('DAY'), on='DAY')

并将大小列重命名/将N / A填为0。

您可以使用merge ,但是执行合并时要设置how="outer"

df3 = df1.merge(df2[["DAY", "Size"]], how="left")

设置how="left"将返回最左侧表(在本例中为df1中的所有行,即使df2没有匹配的记录。 对于没有匹配记录的记录, NaN将填充df1没有记录的df2列。

你可以试试:

data = pd.merge(df1,df2, on=['DAY'], how='outer')

看看这是否能解决您的意思:

df = df1.merge(df2, on=['D', 'M', 'Y', 'DAY'], how='left')
df['FldSz'] = df['Size'].fillna(0)

暂无
暂无

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

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