【发布时间】:2021-01-23 09:16:13
【问题描述】:
我正在尝试转换此代码 -
for item in data['item'].unique():
response = process_item(item) # returns List[Dict[Text, Optional[int]]]
response = pd.DataFrame(response)
response['item'] = item
final_response = final_response.append(response)
类似于 -
data = data[['item']].drop_duplicates().reset_index(drop=True)
final_response = data[['item']].apply(lambda x: process_item(x))
final_response['item'] = data['item']
这个想法是稍后使用 dask 并行处理数据帧上的应用。
我尝试从 process_item 返回一个 pd.DataFrame 但我得到 ValueError: If using all scalar values, you must pass an index
响应看起来像这样 -
A B C
0 456 foo bar 123.0
如何解决 ValueError 以及我的假设 apply 会将输出 df 从 process_item 附加到 final_response 是否正确?
编辑:添加示例数据
在 pd.Series 中包装 process_item 的输出 -
#output from process_item
{'A': [456, 789], 'B': ['foo bar', 'dog bar'], 'C': [123.0, 160.0]}
#printing ouput in pd.Series
A [456, 789]
B [foo bar, dog bar]
C [123.0, 160.0]
#Adding a new 'item' column
A B C item
0 [456, 789] [foo bar, dog bar] [123.0, 160.0] bar
下面是从第一个代码sn -p -
#output from process_item
{'A': [456, 789], 'B': ['foo bar', 'dog bar'], 'C': [123.0, 160.0]}
#output from process_item in pd.DataFrame
A B C
0 456 foo bar 123.0
1 789 dog bar 160.0
#Adding a new 'item' column
A B C item
0 456 foo bar 123.0 bar
1 789 dog bar 160.0 bar
我需要按照第二个示例添加的项目。
编辑(已解决):
我终于能够让它与@yugandhar 共享的 split_dataframe_rows 函数中的一些变化一起工作。
1. 计算 max_split - 它正在计算新添加的“item”列的长度,其中包含“bar”,因此计算结果为 3,而其他列表仅包含两个元素,因此添加了类型检查。
2. split_rows[column_selector].pop(0) 为“item”列抛出错误,说 str 对象没有 pop 属性。因此,仅当它是一个列表时才添加一个检查来执行此操作,否则只需分配。也使用您更新的解决方案进行了测试,并且工作正常。不知道为什么这些问题没有出现在 colab 上,可能是 python 版本的差异之类的。
我试过爆炸,但它对我也不起作用,我想我没有使用 pandas 0.25。我将继续寻找更好的方法来进行拆分。
【问题讨论】:
标签: pandas