如何获得两个pandas数据帧的通用索引?

时间:2018-01-09 14:54:59

标签: python pandas dataframe

我有两个pandas DataFrames df1和df2,我希望对它们进行转换,以便它们仅为2个数据帧共有的索引保留值。

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

8 个答案:

答案 0 :(得分:10)

您可以使用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 = df1.loc[idx]
print (df2)
            values 1
28/11/2000 -0.055276
29/11/2000  0.027427
30/11/2000  0.066009

答案 1 :(得分:6)

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

答案 2 :(得分:4)

并使用isinintersection可能会更快。

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

你有没有试过像

这样的东西
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]]

答案 5 :(得分:1)

索引对象具有一些类似于集合的属性,因此您只需按如下所示进行交集即可:

df1 = df1.reindex[ df1.index & df2.index ]

这将保留交集df中第一个数据框的顺序。

答案 6 :(得分:0)

您可以将pd.merge与使用另一个DataFrame的索引创建的中间DataFrame进行关联:

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"]

答案 7 :(得分:0)

我发现pd.Index和设置组合比numpy.intersect1d和df1.index.intersection(df2.index)快得多。这是我用的:

df2 = df2.loc[pd.Index(set(df1.index)&set(df2.index))]