如何在Python中将Series内的列表元素转为DataFrame并保留NaN?
问题:将DataFrame列中的列表元素转换为子DataFrame,保留NaN
原始DataFrame定义如下:
import pandas as pd import numpy as np df = pd.DataFrame({'column_a' : [1, 2, 3], 'conversions' : [[{'action_type': 'type1', 'value': '1', 'value_plus_10': '11'}, {'action_type': 'type2', 'value': '2', 'value_plus_10': '12'}], np.nan, [{'action_type': 'type3', 'value': '3', 'value_plus_10': '13'}, {'action_type': 'type4', 'value': '4', 'value_plus_10': '14'}]]} )
conversions列的元素是字典列表或NaN,例如:
print(df['conversions'][0]) >>> [{'action_type': 'type1', 'value': '1', 'value_plus_10': '11'}, {'action_type': 'type2', 'value': '2', 'value_plus_10': '12'}]
需要将conversions列的列表元素转换为子DataFrame,NaN则保留,预期效果:
print(df['conversions'][0]) >>> action_type value value_plus_10 0 type1 1 11 1 type2 2 12 print(df['conversions'][1]) >>> nan print(df['conversions'][2]) >>> action_type value value_plus_10 0 type3 3 13 1 type4 4 14
尝试过以下代码,但无实际效果:
df['conversions'] = df['conversions'].apply(lambda x : pd.DataFrame(x) if type(x)=='list' else x)
解决方案
你的代码问题在于类型判断错误:type(x)=='list'无法正确识别列表,因为type(x)返回的是<class 'list'>类型对象,而非字符串'list'。应该用isinstance(x, list)来准确判断类型。
修正后的代码:
df['conversions'] = df['conversions'].apply(lambda x: pd.DataFrame(x) if isinstance(x, list) else x)
验证效果:
print(df['conversions'][0]) # 输出: action_type value value_plus_10 0 type1 1 11 1 type2 2 12 print(df['conversions'][1]) # 输出:nan print(df['conversions'][2]) # 输出: action_type value value_plus_10 0 type3 3 13 1 type4 4 14
如果需要更宽泛的可迭代类型判断,也可以用pd.api.types.is_list_like(x),但针对当前场景,isinstance(x, list)的判断更精准。
内容的提问来源于stack exchange,提问作者Mark the otter
相关产品推荐
相关产品推荐

