您指出的问题是因为NaN
(非数字值)的存在导致了处理失败。以下是两种可能使用pd.Series.str
和pd.Series
方法修复问题的方法:
第一种方法:
out = df["stats"].str[0].apply(pd.Series).drop(0, axis=1)
该方法首先通过.str[0]
访问列表中的第一个元素(即字典),然后应用pd.Series
将字典转换为新的DataFrame列。最后,使用drop(0, axis=1)
移除可能出现的不需要的索引列。
第二种方法:
stats = df["stats"].str[0]
templ = dict.fromkeys(["city", "last_time"], np.nan) # 更正:这里应填充np.nan而非直接写入'None'
out = stats.where(stats.notnull(), templ).apply(pd.Series)
这种方法同样先获取“stats”列中的第一个元素,之后创建一个模板字典templ
,其中键为"city"和"last_time",值默认为np.nan
。接着,使用where
函数将stats
中非空的部分保留下来,否则用templ
中的np.nan
填充。最后将结果应用pd.Series
转换为DataFrame。
实际输出如下所示:
city last_time
0 NaN 1234567.00
1 None NaN
2 Seattle 45678999876.00
使用的输入数据为:
df = pd.DataFrame(
{
"stats": [
[{"city": None, "last_time": 1234567}],
[],
[{"city": "Seattle", "last_time": 45678999876}]
]
}
)