作为Python数据处理的新手,我遇到了一个棘手的问题,需要将特定类型的数据框转换为更易于操作的格式。通过Baserow数据库API获取的数据中,包含了一种特殊结构——列表里嵌套字典,例如:
[{'id': 1207327, 'value': 'foo'}, {'id': 1207330, 'value': 'bar'}]
在数据框的某些列中,这样的列表代表了相关数据,而其他单元格则可能包含空列表[]
。
目前我的数据框看起来像这样(实际上要大得多):
import pandas as pd
test_df = pd.DataFrame({
'ID' : [1,2],
'PROPERTY ONE': [
[{'id': 1207327, 'value': 'foo'}, {'id': 1207330, 'value': 'bar'}],
[]
]
})
输出是这样的:
ID PROPERTY ONE
0 1 [{'id': 1207327, 'value': 'foo'}, {'id': 12073...
1 2 []
我想要实现的目标是,高效地将这些嵌套的字典列表解包,变成简单的值列表或以某种分隔符连接的字符串,比如:
['foo', 'bar']
我的问题是:
我已经用两个for
循环实现了这个功能,但感觉这种方法既低效又笨拙。是否有更简洁、向量化的方法来完成这项任务?
已尝试的方法:
我的循环解决方案大致分为两步:
- 遍历所有列以找到含有该类型数据的列。
- 对这些列中的每一行/单元格,使用
pd.DataFrame.from_dict
将列表转换为数据框,再提取出value
列的值并转换为列表。
具体代码如下:
new_column = []
for array in test_df['PROPERTY ONE']:
tmp_dfr = pd.DataFrame.from_dict(array) if array else pd.DataFrame()
values = tmp_dfr['value'].tolist() if 'value' in tmp_dfr.columns else []
new_column.append(values)
new_column = pd.Series(new_column)
尽管这能解决问题,但我深知向量化操作在Pandas中更为高效。我在寻找相关答案时,发现了类似问题的讨论,比如这里和这里,但由于对Pandas不够熟悉,我未能将那些解决方案应用到自己的问题上,特别是在遇到含有空列表的单元格时,频繁遇到异常。
寻求帮助:
我希望能找到一种直接、高效的Pandas技巧,能够优雅地处理这种嵌套结构,避免繁琐的循环,并且能妥善处理空值情况。请高手指点迷津!