我知道这是一个普遍的问题,但是熊猫上的变化太多,以至于我找不到解决问题的方法。
我有两个DataFrames-一个用于today
,一个用于yesterday
,并且想要创建两个同时用作输入的新df。
基于我的唯一列-两个df之间的比较可以具有三个输出之一。
today
和yesterday
中today
中,而不是yesterday
today
,而是在yesterday
中我想合并第一个df,使其输出#1和#2,其中yesterday
中的值优先,并添加来自yesterday
的任何其他列。
第二个输出我只是想输出#3。
使用一些示例:
今天
index c1 c2 unique
1 x y 14A
2 x y 15A
4 x y 17A
5 x y 18A
6 x y 19A
昨天
index c1 c2 unique c3
1 a b 14A z
2 a b 15A z
3 a b 16A z
4 a b 17A z
output1(#1&#2)
index c1 c2 unique c3
1 a b 14A z
2 a b 15A z
4 a b 17A z
5 x y 18A
6 x y 19A
output2(#3)
index c1 c2 unique c3
3 a b 16A z
一些额外的东西:
pd.merge
用于#1,我真的很希望合并时没有_x
和_y
重复的列。yest[~yest['UniqueKey'].isin(today['UniqueKey'])]
,但我认为它可行吗?非常感谢您的帮助。
谢谢。
答案 0 :(得分:2)
答案 1 :(得分:2)
我对第一个要求(输出1和输出2)的解决方案
case1 = yesterday[yesterday['unique'].isin(today['unique'])]
case2 = today[~today['unique'].isin(yesterday['unique'])]
output_1_2 = case1.append(case2, ignore_index = True)
output_1_2.replace(np.nan, "", regex = True) # to replace NaN
对于第二个需求(输出3),您的方法有效。
答案 2 :(得分:1)
输出1(#1&#2)可以使用pandas.DataFrame.combine_first
如果尚未完成,请将unique
列设置为数据框的索引
today = today.set_index('unique')
yesterday = yesterday.set_index('unique')
然后
yesterday[yesterday.index.isin(today.index)].combine_first(today).reset_index()
unique c1 c2 c3 index
0 14A a b z 1.0
1 15A a b z 2.0
2 17A a b z 4.0
3 18A x y NaN 5.0
4 19A x y NaN 6.0
输出2(#3)可以使用两个索引&.loc
的集合差来获得,或者更好的是使用否定的isin
和布尔索引
yesterday[~yesterday.index.isin(today.index)]
# or: yesterday.loc[list(set(yesterday.index) - set(today.index))]
# both produce the following output:
unique index c1 c2 c3
0 16A 3 a b z