pandas使用isin和append查找数据帧

时间:2018-03-14 13:21:07

标签: python pandas

我正在寻找一种从查找数据框中动态添加列的方法,假设我有这个例子:

    import pandas as pd


df = pd.DataFrame({'col1': ["monkey", "monkye", "ape", "banana", "apple", "aple"], 
                   'col2': ["apple", "banana", "", "banana", "", ""], 
                   'col3': ["monkey", "apple", "pear", "", "apple", "aple"]})

monkey = pd.DataFrame({0: ["monkey", "monkye", "etc..", "etc.."]})
apple = pd.DataFrame({0: ["apple", "aple", "etc..", "etc.."]})
banana = pd.DataFrame({0: ["banana", "bananaa", "etc..", "etc.."]})

dataframes = [banana, apple, monkey]

for dataframe in dataframes:
    df[['a','b','c']] = df[['col1', 'col2', 'col3']].isin(dataframe[0])

print df

因此,这将打印df[['a','b','c']]一直被替换的地方:

     col1    col2    col3      a      b      c
0  monkey   apple  monkey   True  False   True
1  monkye  banana   apple   True  False  False
2     ape            pear  False  False  False
3  banana  banana          False  False  False
4   apple           apple  False  False  False
5    aple            aple  False  False  False

但我所追求的是一栏香蕉,一栏是苹果,一栏是猴子,所以看起来像这样:

     col1    col2    col3 banana  apple monkey 
0  monkey   apple  monkey  False   True   True
1  monkye  banana   apple   True   True   True
2     ape            pear  False  False  False
3  banana  banana           True  False  False
4   apple           apple  False   True  False
5    aple            aple  False   True  False

2 个答案:

答案 0 :(得分:2)

我相信您需要定义DataFrames及其名称的元组列表,然后将转换列与列表进行比较,并按DataFrame.any检查每行至少一个True

dataframes = [('banana', banana), ('apple',apple), ('monkey',monkey)]

for k, v in dataframes:
    df[k] = df[['col1', 'col2', 'col3']].isin(v[0].tolist()).any(axis=1)
print (df)

     col1    col2    col3  banana  apple  monkey
0  monkey   apple  monkey   False   True    True
1  monkye  banana   apple    True   True    True
2     ape            pear   False  False   False
3  banana  banana            True  False   False
4   apple           apple   False   True   False
5    aple            aple   False   True   False

如果订单不重要,请使用dictionary

dataframes = {'banana': banana, 'apple':apple, 'monkey':monkey}

for k, v in dataframes.items():
    df[k] = df[['col1', 'col2', 'col3']].isin(v[0].tolist()).any(1)
print (df)

     col1    col2    col3  apple  banana  monkey
0  monkey   apple  monkey   True   False    True
1  monkye  banana   apple   True    True    True
2     ape            pear  False   False   False
3  banana  banana          False    True   False
4   apple           apple   True   False   False
5    aple            aple   True   False   False

答案 1 :(得分:2)

解决方案1:

使用交集来查看行中是否存在任何有效拼写。如果dataframesdict而非list

,则此过程会更加方便
dataframes = {'monkey': monkey, 'banana': banana, 'apple': apple}
df.assign(
  **{k: df.apply(lambda x: np.intersect1d(x.values, v.values).size > 0, axis=1)
    for k, v in dataframes.items()}
)

输出:

     col1    col2    col3  apple  banana  monkey
0  monkey   apple  monkey   True   False    True
1  monkye  banana   apple   True    True    True
2     ape            pear  False   False   False
3  banana  banana          False    True   False
4   apple           apple   True   False   False
5    aple            aple   True   False   False

然后您可以将其分配回原始变量(覆盖df)或其他变量。

解决方案2:

另一种选择是使用正则表达式进行匹配。

导入重新 patterns = {'apple':re.compile(r'apple | aple | etc .. | etc ..'),             '猴子':re.compile(r'monkey | monkye | etc .. | etc ..'),             'banana':re.compile(r'banana | bananaa | etc .. | etc ..')}

df.assign(
  **{k: df.apply(lambda x: True if re.match(p, ' '.join(x.values)) else False, axis=1)
     for k, p in patterns.items()}
)

输出相同。但是,正则表达式将为您提供更灵活的匹配环境。