dar*_*agh 5 python filter dataframe pandas
我有两个这样的数据框:
df1
sales day ...
index
1001 567 321
1002 600 1530
1005 789 998
1008 825 775
1002 300 1120
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我只想保留 df2 中索引和日期值与 df1 完全相同的行
所以结果应该是:
df2
sales day ...
index
1001 567 321
1002 600 1530
1005 789 998
1008 825 775
1002 300 1120
Run Code Online (Sandbox Code Playgroud)
我无法使用 isin 函数,如下所示,因为 df2 中的某些行具有相同的索引但日期值不同。索引和日期的组合是唯一的。
df2 = df2[df2.index.isin(df1.index)]
Run Code Online (Sandbox Code Playgroud)
本质上我想在 SQL 中做的是
select *
from table1 t1,
table2 t2,
where t1.id = t2.id
and t1.day = t2.day;
Run Code Online (Sandbox Code Playgroud)
想法是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
Run Code Online (Sandbox Code Playgroud)
替代方案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
Run Code Online (Sandbox Code Playgroud)