簡體   English   中英

將 pandas dataframe 的兩列與字符串列表進行比較

[英]compare two columns of pandas dataframe with a list of strings

這是我的 dataframe:

import pandas as pd
df = pd.DataFrame({'a': ['axy a', 'xyz b'], 'b': ['obj e', 'oaw r']})

我有一個字符串列表:

s1 = 'lorem obj e'
s2 = 'lorem obj e lorem axy a'
s3 = 'lorem xyz b lorem oaw r'
s4 = 'lorem lorem oaw r'
s5 = 'lorem lorem axy a lorem obj e'
s_all = [s1, s2, s3, s4, s5]

現在我想獲取每一行並檢查該行的兩列是否存在於s_all的任何字符串中。 例如對於第一行 I select axy_aobj_e並檢查它們是否都存在於s_all的字符串中。 它們都存在於s2s5中。

我想要的結果是這樣的:

       a      b      c
0  axy a  obj e  lorem obj e lorem axy a
1  axy a  obj e  lorem lorem axy a lorem obj e
2  xyz b  oaw r  lorem xyz b lorem oaw r

這是我的嘗試,但沒有奏效:

l = []
for sentence in s_all:
    for i in range(len(df)):
        if df.a.values[i] in sentence and df.b.values[i] in sentence:
            l.append(sentence)
        else:
            l.append(np.nan)

我嘗試將 append 結果放入一個列表中,然后使用該列表創建我想要的c列,但它沒有用。

您可以使用applyexplode創建一個新系列concat並與您的 DataFrame 連接

match_series = df.apply(lambda row: [s for s in s_all if row['a'] in s and row['b'] in s], axis=1).explode()
pd.concat([df, match_series], axis=1)

Output

       a      b                              0
0  axy a  obj e        lorem obj e lorem axy a
0  axy a  obj e  lorem lorem axy a lorem obj e
1  xyz b  oaw r        lorem xyz b lorem oaw r

您可以編寫一個小助手 function 並將此 function 逐行應用於您的df:

def func(row):
    out = []
    a, b = row 
    for s in s_all:
        if all([a in s, b in s]):
            out.append(s)
    return out

# if you have more than 2 columns or don't know how many, here more general approach
# other than that, same function as above
def func(row):
    out = [] 
    for s in s_all:
        if all([string in s for string in row.tolist()]):
            out.append(s)
    return out

df['c'] = df.apply(func, axis=1)

或者作為 lambda function 的單線:

df['c'] = df.apply(lambda row: [s for s in s_all if all(string in s for elem in row.tolist() for string in elem)], axis=1)

function 返回一個包含結果的列表。 為了使每個列表元素成為自己的行,我們使用explode

df = df.explode(column='c')
print(df)

Output:

       a      b                              c
0  axy a  obj e        lorem obj e lorem axy a
0  axy a  obj e  lorem lorem axy a lorem obj e
1  xyz b  oaw r        lorem xyz b lorem oaw r

由於參考字符串中ab模式多次出現,您還需要重復它們的列表。 這是通過附加l_al_b的。 反過來,構建了一個新的 dataframe df_new 修改你的 for 循環就可以了。

l = []
l_a = []
l_b = []
for i in range(len(df)):
    for sentence in s_all:
        if df.a.values[i] in sentence and df.b.values[i] in sentence:
            l.append(sentence)
            l_a.append(df.a.values[i])
            l_b.append(df.b.values[i])

df_new = pd.DataFrame({'a' : l_a, 'b' : l_b, 'c' : l})

這產生

一個 b c
0 軸一 對象 lorem obj e lorem axy a
1 軸一 對象 lorem lorem axy a lorem obj e
2 xyz b 哇 r lorem xyz b lorem oaw r

暫無
暫無

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

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