我有2个这样的数据框:
df1
sales day ...
index
1001 567 321
1002 600 1530
1005 789 998
1008 825 775
1002 300 1120
df2
sales day ...
index
1001 567 321
1002 600 1530
1005 789 998
1014 620 1000
1008 825 775
1009 589 1100
1002 300 1120
1005 770 400
1008 820 1600
我只想在df2中保留索引和日期值与df1完全相同的行
所以结果应该是:
df2
sales day ...
index
1001 567 321
1002 600 1530
1005 789 998
1008 825 775
1002 300 1120
我不能按以下方式使用isin函数,因为df2中有行具有相同的索引但行值不同。索引和日期的组合是唯一的。
df2 = df2[df2.index.isin(df1.index)]
基本上我想在SQL中做的事
select *
from table1 t1,
table2 t2,
where t1.id = t2.id
and t1.day = t2.day;
答案 0 :(得分:1)
使用MultiIndex
参数由DataFrame.set_index
创建append
,因此可能通过Index.isin
进行过滤:
df = df2[df2.set_index('day', append=True).index.isin(df1.set_index('day', append=True).index)]
print (df)
sales day
index
1001 567 321
1002 600 1530
1005 789 998
1008 825 775
1002 300 1120
替代merge
:
df = (df1.reset_index()
.merge(df2.reset_index(), on=['day','index'], suffixes=('_',''))
.set_index('index')[df2.columns])
print (df)
sales day
index
1001 567 321
1002 600 1530
1005 789 998
1008 825 775
1002 300 1120
答案 1 :(得分:1)
您可以做的一件事是在两个数据帧上设置一个双索引并使用loc访问:
df1 = df1.reset_index().set_index(['index','day'])
df2 = df2.reset_index().set_index(['index','day'])
print(df2.loc[df1.index])
输出(如果您不希望使用双索引,则可以执行reset_index(level=1)
)
sales
index day
1001 321 567
1002 1530 600
1005 998 789
1008 775 825
1002 1120 300