簡體   English   中英

檢查 Pandas 列是否包含來自另一列的值

[英]Check if Pandas column contains value from another column

如果df['col']='a','b','c'df2['col']='a123','b456','d789'我如何創建df2['is_contained']='a','b','no_match'如果在df2['col']的值中找到來自df['col'] df['col']值,則返回 df['col'] 值,如果沒有找到匹配項,則返回 'no_match '返回? 此外,我不希望有多個匹配項,但在不太可能的情況下,我想返回一個類似“Multiple Matches”的字符串。

有了這個玩具數據集,我們想向df2添加一個新列,其中將包含前三行的no_match ,最后一行將包含值'd' ,因為該行的col值(字母'a' ) 出現在 df1 中。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


df1 = pd.DataFrame({'col': ['a', 'b', 'c', 'd']})
df2 = pd.DataFrame({'col': ['a123','b456','d789', 'a']})

換句話說,只有當行的df2['col']值出現在df1['col']中的某個位置時,才應該使用來自df1的值來填充df2中的這個新列。

In [2]: df1
Out[2]:
  col
0   a
1   b
2   c
3   d

In [3]: df2
Out[3]:
    col
0  a123
1  b456
2  d789
3     a

如果這是理解您的問題的正確方法,那么您可以使用 pandas isin來做到這一點:

In [4]: df2.col.isin(df1.col)
Out[4]:
0    False
1    False
2    False
3     True
Name: col, dtype: bool

僅當df1.col中的值也在df2.col中時,這才評估為True

然后,如果您完全熟悉 R,則可以使用與 R 中的np.where或多或少相同的ifelse

In [5]:     np.where(df2.col.isin(df1.col), df1.col, 'NO_MATCH')
Out[5]:
0    NO_MATCH
1    NO_MATCH
2    NO_MATCH
3           d
Name: col, dtype: object

對於 df1.col 中出現df2.col值的行, df1.col df1.col值。 如果df2.col值不是df1.col的成員,則將使用默認'NO_MATCH'值。

您必須首先保證索引匹配。 為簡化起見,我將顯示列好像在同一數據框中。 訣竅是在列軸中使用 apply 方法:

df = pd.DataFrame({'col1': ['a', 'b', 'c', 'd'],
                   'col2': ['a123','b456','d789', 'a']})
df['contained'] = df.apply(lambda x: x.col1 in x.col2, axis=1)
df
  col1  col2  contained
0    a  a123       True
1    b  b456       True
2    c  d789      False
3    d     a      False

在 0.13 中,您可以使用str.extract

In [11]: df1 = pd.DataFrame({'col': ['a', 'b', 'c']})

In [12]: df2 = pd.DataFrame({'col': ['d23','b456','a789']})

In [13]: df2.col.str.extract('(%s)' % '|'.join(df1.col))
Out[13]: 
0    NaN
1      b
2      a
Name: col, dtype: object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM