簡體   English   中英

如何替換包含列的列表的所有元素?

[英]How to replace all elements of a list containing column?

我有一個 Pandas DataFrame ,其中有一列包含整數列表。

我想將 map 不同的值添加到這個整數列表中,並且遇到了幾個問題。

這是我目前擁有的(帶有測試數據集):

data = [["Item_1", [0, 3, 4]], ["Item_2", [22, 4, 5]], ["Item_3", [0, 4, 5]]]

df = pd.DataFrame(data, columns=["Item_ID", "Values"])

# Convert to string
df["Values"] = [str(x) for x in df["Values"]]

# Find and Replace:
def replace_vals(x):

    replace_dict = {
        **{
            r"\b1\b": "A",
            r"\b12\b": "B",
            r"\b3\b": "C",
            r"\b4\b": "D",
            r"\b5\b": "E",
            r"\b22\b": "G",
        },
    }
    for pattern, replacer in replace_dict.items():
        if re.search(pattern, x, re.IGNORECASE):
            return replacer
    return x

df["corrected_vals"] = df["Values"].apply(replace_vals)

問題是我希望替換列表中的所有值,而不僅僅是遇到的第一個值。

有沒有辦法進行這種搜索和替換,或者以替換列表的每個元素的方式進行映射?

目前這是我的輸入:

Item ID  Values
Item_1   [0,3,4]
Item_2   [22,4,5]
Item_3   [0,4,5]

這是我的 output:

Item ID  Values    Corrected_vals
Item_1   [0,3,4]      C   
Item_2   [22,4,5]     D
Item_3   [0,4,5]      D

理想的 output 是這樣的:

Item ID  Values    Corrected_vals
Item_1   [0,3,4]      [C,D]   
Item_2   [22,4,5]     [D,E,G]
Item_3   [0,4,5]      [D,E]

替換字典中具有模式的每個列表元素的位置。

感謝您的任何幫助!

這會將映射應用於元素列表,僅當它們在my_dict中時才返回它們:

my_dict = {0:"C", 4:"D", 5: "E"}
df["Corrected_vals"] = df.apply(lambda x: [my_dict.get(el) for el in x.Values if el in my_dict], axis=1)

output:

  Item_ID      Values Corrected_vals
0  Item_1   [0, 3, 4]         [C, D]
1  Item_2  [22, 4, 5]         [D, E]
2  Item_3   [0, 4, 5]      [C, D, E]

注意:如果Values是一個字符串,則轉換為一個整數列表:

import ast
df["Values"] = df.Values.apply(ast.literal_eval)

使用re.sub()而不是返回替換。

    for pattern, replacer in replace_dict.items():
        x = re.sub(pattern, replacer, flags=re.IGNORECASE)
    return x
df1=df.explode('Values')#Explode

df1=df1[df1['Values'].astype(int)>0]#Filter out 0
df1['Values']=df1['Values'].apply(lambda x: chr(ord('a') + x)).str.upper()#Convert to alphas
pd.merge(df,df1.groupby('Item_ID')['Values'].agg(list).reset_index(), on='Item_ID')#Group into list and join

暫無
暫無

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

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