从具有特定条件的列中的字典中删除所有非数字符号
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)
我在数据框中有一列。
我想保留数字值仅用于具有“金额”的行:,其中这些数字表示付款金额。
我理想的列输出 - 数字仅保留在行中,之前是“金额”。其他所有内容均为 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)