如何在其他四个数据框的列中检查一个数据框列是不是可用?

Posted

技术标签:

【中文标题】如何在其他四个数据框的列中检查一个数据框列是不是可用?【英文标题】:How to check one dataframe column available or not in other four dataframe's column?如何在其他四个数据框的列中检查一个数据框列是否可用? 【发布时间】:2017-01-30 06:46:50 【问题描述】:

我有一个如下所示的基本数据框-

df1_data = 'id' :0:'101',1:'102',2:'103',3:'104',4:'105',
        'sym1' :0:'abc',1:'pqr',2:'xyz',3:'mno',4:'lmn'
df1 = pd.DataFrame(df1_data)
print df1

    id sym1
0  101  abc
1  102  pqr
2  103  xyz
3  104  mno
4  105  lmn

从这个数据框中,我想检查列 sym1 在其他四个数据框列中是否可用?

四种不同的数据框:

df2_data = 'sym2' :0:'abc',1:'xxx',2:'xyz',3:'mno',
        'name' :0:'a',1:'b',2:'c',3:'d'
df2 = pd.DataFrame(df2_data)
print df2

df3_data = 'sym2' :0:'abc',1:'xxx',2:'xyz',3:'mno',
            'name' :0:'h',1:'i',2:'k',3:'l'
df3 = pd.DataFrame(df2_data)
print df3

df4_data = 'sym2' :0:'abc',1:'xxx',2:'xyz',3:'mno',
            'name' :0:'p',1:'q',2:'r',3:'s'
df4 = pd.DataFrame(df4_data)
print df4

df5_data = 'sym2' :0:'abc',1:'xxx',2:'xyz',3:'mno',
            'name' :0:'w',1:'x',2:'y',3:'z'
df5 = pd.DataFrame(df5_data)
print df5

在 Dataframes df2,df3,df4,df5 中可用的 sym2 列中,可能包含相同的符号,也可能不包含相同的符号。我的意图是检查 df2,df3,df4,df5 数据帧 sym2 列值中是否可用 sym1 列值?

预期输出-

    id sym1
0  102  pqr
1  105  lmn

结论-

符号 pqrlmn 在数据帧 df2、df3、df4 和 df5 的 sym2 列中不可用。

【问题讨论】:

【参考方案1】: 使用isin 检查df1.sym1 的每个元素是否在其他可迭代对象中 使用pd.concat 将所有其他数据帧串在一起
df1[~df1.sym1.isin(pd.concat([df2, df3, df4, df5]).sym2)]

    id sym1
1  102  pqr
4  105  lmn

numpy 变体快 3 倍

df1[~df1.sym1.isin(np.concatenate([d.sym2.values for d in [df2, df3, df4, df5]]))]

【讨论】:

【参考方案2】:

merge和参数indicator比较的另一种解决方案:

dfs = [df2,df3,df4,df5]
df = pd.concat(dfs, keys=['df2','df3','df4','df5'])
print (df)
      name sym2
df2 0    a  abc
    1    b  xxx
    2    c  xyz
    3    d  mno
df3 0    a  abc
    1    b  xxx
    2    c  xyz
    3    d  mno
df4 0    p  abc
    1    q  xxx
    2    r  xyz
    3    s  mno
df5 0    w  abc
    1    x  xxx
    2    y  xyz
    3    z  mno
merged = pd.merge(df.rename_axis(['dfs','idx']).reset_index(), 
                  df1, 
                  left_on='sym2', 
                  right_on='sym1', 
                  how='outer', 
                  indicator=True)
print (merged)
    dfs  idx name sym2   id sym1      _merge
0   df2  0.0    a  abc  101  abc        both
1   df3  0.0    a  abc  101  abc        both
2   df4  0.0    p  abc  101  abc        both
3   df5  0.0    w  abc  101  abc        both
4   df2  1.0    b  xxx  NaN  NaN   left_only
5   df3  1.0    b  xxx  NaN  NaN   left_only
6   df4  1.0    q  xxx  NaN  NaN   left_only
7   df5  1.0    x  xxx  NaN  NaN   left_only
8   df2  2.0    c  xyz  103  xyz        both
9   df3  2.0    c  xyz  103  xyz        both
10  df4  2.0    r  xyz  103  xyz        both
11  df5  2.0    y  xyz  103  xyz        both
12  df2  3.0    d  mno  104  mno        both
13  df3  3.0    d  mno  104  mno        both
14  df4  3.0    s  mno  104  mno        both
15  df5  3.0    z  mno  104  mno        both
16  NaN  NaN  NaN  NaN  102  pqr  right_only
17  NaN  NaN  NaN  NaN  105  lmn  right_only

print (merged.loc[merged['_merge']=='right_only', ['id','sym1']])
     id sym1
16  102  pqr
17  105  lmn

print (merged.loc[merged['_merge']=='left_only', ['dfs', 'sym2']])
   dfs sym2
4  df2  xxx
5  df3  xxx
6  df4  xxx
7  df5  xxx

【讨论】:

谢谢。这也是找出我想要什么的好方法......哪一个性能最好? 在我看来,如果只需要不在dfs 中的值,更好的是piRSquared's 解决方案。我的解决方案是进行更深入的测试,所以它更复杂(可能更慢,我不测试) 我测试它,isin 解决方案在测试数据上更快。对于您的真实数据,最好的方法是对其进行测试。

以上是关于如何在其他四个数据框的列中检查一个数据框列是不是可用?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个计算数据框列中 ID 频率的列?

检查数据框列中的所有值是不是相同

通过引用字符串位置检查数据框列中的子字符串

如何在熊猫数据框列中获取 NaN 观察的频率 [重复]

如何将 numpy 数组存储在 Pandas 数据框的列中?

如何将 numpy 数组存储在 Pandas 数据框的列中?