簡體   English   中英

Pandas:對特定行應用過濾器

[英]Pandas: Apply filter for specific rows

我有一個 df,其中一列具有 dict 值。 我想解析信息並存儲在新的/同一列中。 我目前正在做如下

data = [{'objtype': 'dict', 'objval': '{"name":"adam"}'}, {'objtype': 'dict', 'objval': '{"name":"eve"}'}, {'objtype': 'dict', 'objval': '{"name":"krishna"}'}, {'objtype': 'dict', 'objval': '{"name":"radha"}'}]

df = pd.DataFrame(data)
df['extract'] = df['objval'].apply(ast.literal_eval).apply(lambda x: x.get('name'))

這打破了下面的例子

[{'objtype': 'text', 'objval': 'adam'}, {'objtype': 'text', 'objval': 'eve'}, {'objtype': 'dict', 'objval': '{"name":"krishna"}'}, {'objtype': 'dict', 'objval': '{"name":"radha"}'}]

我想應用像下面這樣的過濾器

df['extract'] = df['objval'].apply(ast.literal_eval if df['objtype'] == 'dict')

另外:無論 objtype 是 text/dict,最終結果都應該將名稱存儲在新列中。

df['extract'] = df['objval'].apply(ast.literal_eval if df['objtype'] == 'dict')這個語句假設 whereevet objtype 是 dict 值也將是一個 dict。 我也想改變這一點,以便它依賴於數據本身

類似於df['extract'] = df['objval'].apply(ast.literal_eval if type(df['objval']) == 'dict')

您可以使用try..except趕上ValueError被拋出的異常ast.literal_eval

import ast


def get_name(x):
    try:
        x = ast.literal_eval(x)
    except ValueError:
        return x
    return x.get("name")


data = [
    {"objtype": "text", "objval": "adam"},
    {"objtype": "text", "objval": "eve"},
    {"objtype": "dict", "objval": '{"name":"krishna"}'},
    {"objtype": "dict", "objval": '{"name":"radha"}'},
]
df = pd.DataFrame(data)
df["extract"] = df["objval"].apply(get_name)

print(df)

印刷:

  objtype              objval  extract
0    text                adam     adam
1    text                 eve      eve
2    dict  {"name":"krishna"}  krishna
3    dict    {"name":"radha"}    radha

一種使用yaml.safe_load處理 dict、類似 dict 的 str、str 等的方法:

df["objval"].apply(yaml.safe_load).str["name"]

輸出:

0        NaN
1        NaN
2    krishna
3      radha
Name: objval, dtype: object

暫無
暫無

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

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