使用其他DataFrame中的相同列值创建Python DataFrame

时间:2015-03-08 22:00:01

标签: python numpy pandas unique dataframe

我有很多python DataFrames,我希望每个DataFrame在列上都有相同的值。我怎么能这样做?

示例:

  • DataFrame_1有一个字符为A,B,V,D的列
  • DataFrame_2有一个字符为D,C,B的列
  • DataFrame_3有一个char A,B
  • 的列

如何返回包含字符B,B,B的数据帧(因为B在所有数据帧中)

3 个答案:

答案 0 :(得分:0)

一种复杂的方法是使用多个嵌套调用isin

In [39]:

df=pd.DataFrame({'a':['A','B','V','D']})
df1=pd.DataFrame({'a':['D','C','B']})
df2=pd.DataFrame({'a':['A','B']})
df[df.a.isin(df1[df1.a.isin(df2.a)].a)]
Out[39]:
   a
1  B

另一种方法是调用np.intersect1d,这假设值是唯一的:

In [46]:

np.intersect1d(df2.a.unique(), np.intersect1d(df.a.unique(), df1.a.unique()))
Out[46]:
array(['B'], dtype=object)

我们再次执行2内部merges这将合并所有dfs中存在的值:

In [47]:

df.merge(df1, on='a').merge(df2, on='a')
Out[47]:
   a
0  B

<强>定时

In [48]:

%timeit df[df.a.isin(df1[df1.a.isin(df2.a)].a)]
1000 loops, best of 3: 1.51 ms per loop
In [49]:

%timeit np.intersect1d(df2.a.unique(), np.intersect1d(df.a.unique(), df1.a.unique()))
1000 loops, best of 3: 360 µs per loop
In [50]:

%timeit df.merge(df1, on='a').merge(df2, on='a')
100 loops, best of 3: 4.76 ms per loop

numpy方法在此数据集上轻松获胜

答案 1 :(得分:0)

如何将每列作为一个集合处理,然后选择交集:

df = pd.DataFrame({'col1': ['A', 'B', 'V', 'D'], 
                   'col2': ['D', 'C', 'B', 'B'], 
                   'col3': ['A', 'B', 'A', 'B']})

# First df column is a set
new_set = set(df.iloc[:, 0])  
# Iterate through remaining columns in df, taking intersection
for col in df.iloc[:, 1:]:
    new_set = set(df[col]).intersection(new_set)

将集合转换回数据集或系列:

new_df = pd.DataFrame([new_set])
print(new_df)
   0
0  B

答案 2 :(得分:0)

要获得所有三个DF中存在的唯一值,您可以使用:

unique_vals = set(df1['col']).intersection(df2['col'], df3['col'])

哪个(不出所料)会给你一个set,你可以按照自己的意愿将其放回DF /系列。