[英]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.