n个数据帧的行交集的并集

时间:2018-02-12 23:19:10

标签: pandas filter intersection concat

说我有n dataframe,在这个例子中n = 3.

dataframe

我想要一个union,其中包含C列中的值出现在每个intersection dfn 中的所有行。因此,这是列上dataframes dataframe **Expected df** 0 True 3 21.0 1 True 1 23.0 2 False 2 25.0 3 False 4 25.5 4 False 1 25.0 0 True 3 21.0 1 True 1 23.0 2 False 2 25.0 3 False 4 25.5 0 True 3 21.0 1 True 2 23.0 2 False 2 25.0 3 False 1 25.0 4 False 4 25.5 dataframe的{​​{1}},在这种情况下是C列。所以对于上面的数据帧,19.0,26.0和27.50的行没有不能进入最后的dataframes

import pandas as pd
df1 = pd.DataFrame({'A': [True,True,False,False,False,True], 'B': [3,1,2,4,1,0],
                    'C': [21.0,23.0,25.0,25.5,25.0,26.0]})
df2 = pd.DataFrame({'A': [True,True,False,False,False], 'B': [3,1,2,4,2],
                    'C': [21.0,23.0,25.0,25.5,19.0]})
df3 = pd.DataFrame({'A': [True,True,False,False,False,True], 'B': [3,2,2,1,4,0],
                    'C': [21.0,23.0,25.0,25.0,25.5,27.5]})
dfn = ...

因此最终 http://youdomain.com/your/path?_=1518477167725只有>,列中的值所有 remote=true

可重复的代码:

INLINE()

3 个答案:

答案 0 :(得分:2)

直接的方法似乎是计算(n路交叉)公共C值(作为集合/列表),然后使用.isin进行过滤:

common_C_values = set.intersection(set(df1['C']), set(df2['C']), set(df3['C']))
df_all = pd.concat([df1,df2,df3])
df_all = df_all[ df_all['C'].isin(common_C_values) ]

答案 1 :(得分:1)

为简单起见,请将数据框存储在列表中。我们将利用set操作尽可能加快速度。

df_list = [df1, df2, df3, ...]
common_idx = set.intersection(*[set(df['C']) for df in df_list]) 

print(common_idx)
{21.0, 23.0, 25.0, 25.5}

感谢@smci的改进! set.intersection将找到所有索引的交集。最后,调用pd.concat,垂直连接数据框,然后使用query过滤从上一步获得的常见索引。

pd.concat(df_list, ignore_index=True).query('C in @common_idx')

        A  B     C
0    True  3  21.0
1    True  1  23.0
2   False  2  25.0
3   False  4  25.5
4   False  1  25.0
5    True  3  21.0
6    True  1  23.0
7   False  2  25.0
8   False  4  25.5
9    True  3  21.0
10   True  2  23.0
11  False  2  25.0
12  False  1  25.0
13  False  4  25.5

答案 2 :(得分:1)

您可以使用pd.concat:

# merge column C from all DataFrames
df_C = pd.concat([df1,df2,df3],1)['C']
# concat all DataFrames
df_all = pd.concat([df1,df2,df3])
# only extract rows with its C value appears in all DataFrames C columns.
df_all.loc[df_all.apply(lambda x: df_C.eq(x.C).sum().all(), axis=1)]
Out[105]: 
       A  B     C
0   True  3  21.0
1   True  1  23.0
2  False  2  25.0
3  False  4  25.5
4  False  1  25.0
0   True  3  21.0
1   True  1  23.0
2  False  2  25.0
3  False  4  25.5
0   True  3  21.0
1   True  2  23.0
2  False  2  25.0
3  False  1  25.0
4  False  4  25.5