![](/img/trans.png)
[英]Python pandas: Combine two dataframes by date index and a common column value
[英]How to get the common index of two pandas dataframes?
我有兩個 Pandas DataFrames df1 和 df2,我想對它們進行轉換,以便它們僅保留兩個數據幀共有的索引的值。
df1
values 1
0
28/11/2000 -0.055276
29/11/2000 0.027427
30/11/2000 0.066009
01/12/2000 0.012749
04/12/2000 0.113892
df2
values 2
24/11/2000 -0.004808
27/11/2000 -0.001812
28/11/2000 -0.026316
29/11/2000 0.015222
30/11/2000 -0.024480
成為
df1
value 1
28/11/2000 -0.055276
29/11/2000 0.027427
30/11/2000 0.066009
df2
value 2
28/11/2000 -0.026316
29/11/2000 0.015222
30/11/2000 -0.024480
您可以使用Index.intersection
+ DataFrame.loc
:
idx = df1.index.intersection(df2.index)
print (idx)
Index(['28/11/2000', '29/11/2000', '30/11/2000'], dtype='object')
numpy.intersect1d
替代解決方案:
idx = np.intersect1d(df1.index, df2.index)
print (idx)
['28/11/2000' '29/11/2000' '30/11/2000']
df1 = df1.loc[idx]
print (df1)
values 1
28/11/2000 -0.055276
29/11/2000 0.027427
30/11/2000 0.066009
df2 = df2.loc[idx]
In [352]: common = df1.index.intersection(df2.index)
In [353]: df1.loc[common]
Out[353]:
values1
0
28/11/2000 -0.055276
29/11/2000 0.027427
30/11/2000 0.066009
In [354]: df2.loc[common]
Out[354]:
values2
0
28/11/2000 -0.026316
29/11/2000 0.015222
30/11/2000 -0.024480
並且,使用isin
。 intersection
可能會更快。
In [286]: df1.loc[df1.index.isin(df2.index)]
Out[286]:
values1
0
28/11/2000 -0.055276
29/11/2000 0.027427
30/11/2000 0.066009
In [287]: df2.loc[df2.index.isin(df1.index)]
Out[287]:
values2
0
28/11/2000 -0.026316
29/11/2000 0.015222
30/11/2000 -0.024480
reindex
+ dropna
df1.reindex(df2.index).dropna()
Out[21]:
values1
28/11/2000 -0.055276
29/11/2000 0.027427
30/11/2000 0.066009
df2.reindex(df1.index).dropna()
Out[22]:
values2
28/11/2000 -0.026316
29/11/2000 0.015222
30/11/2000 -0.024480
索引對象具有一些類似集合的屬性,因此您只需按如下方式進行交集即可:
df1 = df1.reindex[ df1.index & df2.index ]
這保留了交集df
第一個數據幀的順序。
你有沒有嘗試過類似的東西
df1 = df1.loc[[x for x in df1.index if x in df2.index]]
df2 = df2.loc[[x for x in df2.index if x in df1.index]]
您可以將它們與使用其他 DataFrame 的索引創建的中間 DataFrame 進行 pd.merge:
df2_indexes = pd.DataFrame(index=df2.index)
df1 = pd.merge(df1, df2_indexes, left_index=True, right_index=True)
df1_indexes = pd.DataFrame(index=df1.index)
df2 = pd.merge(df2, df1_indexes, left_index=True, right_index=True)
或者你可以使用pd.eval :
df2_indexes = df2.index.values
df1 = df1[eval("df1.index in df2_indexes"]
df1_indexes = df1.index.values
df2 = df2[eval("df2.index in df1_indexes"]
我發現 pd.Index 和 set 組合比 numpy.intersect1d 以及 df1.index.intersection(df2.index) 快得多。 這是我使用的:
df2 = df2.loc[pd.Index(set(df1.index)&set(df2.index))]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.