我的数据框
Items Count ScannedCount
0 {'comp': {'S': '2019-08-02'}... 1032 1032
1 {'comp': {'S': '2019-08-27'}... 1032 1032
物品系列看起来像这样
{'comp': {'S': '2019-08-02T16:54:55.035196+03:00'}, 'ID': {'S': '336'}, 'dID': {'S': '1763523'}, 'fname': {'S': '558012'}}
使用此post的第二个答案,我可以将序列转换为数据框。 问题是如何缩放该操作,因为它发生在每一行上,
当前方法:
遍历每一行并将它们合并为一系列(非常慢)
item_df = pd.DataFrame(df['Items'].iloc[i]) for i in range(df.shape[0])]).reset_index(drop=True), df], axis=1)
将结果与原始数据框保持一致
df = pd.concat([temp, df], axis=1)
我相信第一部分的for
循环是瓶颈。
是否有更快的方法将系列转换为数据框并将其连接回原始数据框。
预期输出:
comp ID dID fname Count ScannedCount
0 2019-08-02T16:54:55 336 1763523 548012 1032 1032
1 2019-09-01T14:52:24 336 1763523 528012 1032 1032
答案 0 :(得分:1)
尝试使用更多柱状解决方案。假设字典中总是有“ S”键,就可以工作。
df_tmp = df['Items'].apply(pd.Series)
for c in df_tmp.columns:
df[c] = df_tmp[c].apply(lambda x: x.get('S'))
df = df.drop(columns='Items')
答案 1 :(得分:0)
看起来像遍历所有df是不可避免的。我不确定是否更好,但是我知道熊猫的做法是使用iterrows()
。
在文档中,他们还提到了特定用例的itertuples()
,但同样,我也不是专家。
希望这会有所帮助!
答案 2 :(得分:0)
测试数据:
import pandas as pd
test_data = {'item' : [{'comp': {'S': '2019-08-02T16:54:55.035196+03:00'}, 'ID': {'S': '336'}, 'dID': {'S': '1763523'}, 'fname': {'S': '558012'}}, {'comp': {'S': '2019-09-02T16:54:55.035196+03:00'}, 'ID': {'S': '336'}, 'dID': {'S': '1763523'}, 'fname': {'S': '558012'}}], 'Count': [1032,1032], 'ScannedCount':[1032,1032]}
df = pd.DataFrame.from_dict(test_data)
Out[64]:
item Count ScannedCount
0 {'comp': {'S': '2019-08-02T16:54:55.035196+03:... 1032 1032
1 {'comp': {'S': '2019-09-02T16:54:55.035196+03:... 1032 1032
据我了解,您尝试获得如下内容:
def extract(row):
item_series = pd.Series({k:v for k,v in row['item'].items()})
result = row.append(item_series)
return result
df = df.apply(extract, axis = 1)
这给您:
Out[67]:
comp ID dID \
0 {'S': '2019-08-02T16:54:55.035196+03:00'} {'S': '336'} {'S': '1763523'}
1 {'S': '2019-09-02T16:54:55.035196+03:00'} {'S': '336'} {'S': '1763523'}
fname
0 {'S': '558012'}
1 {'S': '558012'}
## skipped some columns for clarity