我有两个数据帧,DF1和DF2,DF1是主数据,DF2是增量。来自DF2的数据应插入DF1或用于更新DF1数据。解释如下:
假设DF1具有以下格式:
id_no |开始日期|金额|天
--------------------------------------------
1 | 2016-01-01 | 4650 | 22
2 | 2016-01-02 | 3130 | 45
1 | 2016-01-03 | 4456 | 22
2 | 2016-01-15 | 1234 | 45
DF2包含以下内容:
id_no |开始日期|金额|天
--------------------------------------------
1 | 2016-01-01 | 8650 | 52
2 | 2016-01-02 | 7130 | 65
1 | 2016-01-06 | 3456 | 20
2 | 2016-01-20 | 2345 | 19
3 | 2016-02-02 | 1345 | 19
我需要组合两个数据帧,以便如果DF2的“ id_no”和“开始日期”与DF1相匹配,则应在DF1中将其替换,如果不匹配,则应将其插入DF1。 id_no不是唯一的。
结果应为:
id_no |开始日期|金额|天
--------------------------------------------
1 | 2016-01-01 | 8650 | 52
2 | 2016-01-02 | 7130 | 65
1 | 2016-01-03 | 4456 | 22
2 | 2016-01-15 | 1234 | 45
1 | 2016-01-06 | 3456 | 20
2 | 2016-01-20 | 2345 | 19
3 | 2016-02-02 | 1345 | 19
请有人建议我如何解决这个问题。
答案 0 :(得分:2)
您可以将s = df2["A"]
result = s.str.extractall(r"(\d+/\d+/\d+)")[0]
print(result)
>>> match
0 0 10/01/2016
1 31/10/18
4 0 10/01/2016
5 0 02/20/2017
和id_no
上的两个数据框连接在一起,然后将start_date
和coalesce
列中的amount
与{{1}中的列连接在一起}首先:
days
如果您还有更多列:
df2
答案 1 :(得分:0)
union
应该这样做。
from pyspark.sql import functions as F
grp_by = {'id_no', 'start_date'}
df = df2.union(df1)
df = df.groupby(*grp_by).agg(*[F.first(c).alias(c) for c in set(df.columns)-grp_by])
df.show()
# +-----+----------+----+------+
# |id_no|start_date|days|amount|
# +-----+----------+----+------+
# | 1|2016-01-06| 20| 3456|
# | 2|2016-01-20| 19| 2345|
# | 1|2016-01-03| 22| 4456|
# | 3|2016-02-02| 19| 1345|
# | 2|2016-01-15| 45| 1234|
# | 1|2016-01-01| 52| 8650|
# | 2|2016-01-02| 65| 7130|
# +-----+----------+----+------+