从具有特定条件的列中的字典中删除所有非数字符号

Remove all non-numeric symbols from dictionaries in a column with a specific condition

我在数据框中有一列。

我想保留数字值仅用于具有“金额”的行:,其中这些数字表示付款金额。

我理想的列输出 - 数字仅保留在行中,之前是“金额”。其他所有内容均为 NaN。

value
500
NaN
4
3
NaN

等等

我试过了

test_df['value'] = test_df['value'].str.extract('(\d+)', expand = False)

但它将所有列值转换为 NaN。另外,它不会区分带有“金额”的列:,所以无论如何都没有帮助。

我也尝试了 的解决方案,但到目前为止还没有弄清楚。谢谢!

更新:

{"person": "78afa995795e4d85b5d9ceeca43f5fef", "event": "offer received", 
"value": {"offer id": "9b98b8c7a33c4b65b9aebfe6a799e6d9"}, "time": 0}
{"person": "a03223e636434f42ac4c3df47e8bac43", "event": "offer received", 
"value": {"offer id": "0b1e1539f2cc45b7b9fa7c272da2e1d7"}, "time": 0}
{"person": "e2127556f4f64592b11af22de27a7932", "event": "offer received", 
"value": {"offer id": "2906b810c7d4411798c6938adc9daaa5"}, "time": 0}
{"person": "8ec6ce2a7e7949b1bf142def7d0e0586", "event": "offer received", 
"value": {"offer id": "fafdcd668e3743c1bb461111dcafc2a4"}, "time": 0}

我觉得有字典,所以用Series.str.get:

test_df = pd.read_pickle('col.pkl').to_frame()

test_df['value'] = test_df['value'].str.get('amount')
print (test_df)
        value
0         NaN
1         NaN
2         NaN
3         NaN
4         NaN
      ...
306529   1.59
306530   9.53
306531   3.61
306532   3.53
306533   4.05

[306534 rows x 1 columns]

如果值是一个字典,你应该尝试获取 amount 键(如果它存在的话)

test_df['value'] = test_df['value'].apply(lambda x: x.get("amount") if "amount" in x.keys() else None)

编辑

如果它们不全是字典,则将值转换为字符串并删除 {"amount" :}

test_df['value'] = test_df['value'].apply(lambda x: float(str(x).strip("{'amount' :").strip('}')) if "amount" in str(x) else None)