3 回答

TA贡献1874条经验 获得超12个赞
您想使用.apply(pd.Series),stack()然后重命名您的列:
df.set_index('created_at')['selected'].apply(pd.Series).stack().reset_index().rename(columns={'level_1':'ID',0:'Value'})
created_at ID Value
0 2019-08-13T12:24:53+00:00 982813 False
1 2019-08-13T12:24:53+00:00 1786112 True
2 2019-08-13T12:24:53+00:00 3002218 False
3 2019-08-31T13:47:51+00:00 309279 True
4 2019-08-31T13:47:51+00:00 1903384 False
顺便说一句,为了将来参考,您可以通过提供代码来复制您的起点来更快地获得答案。大部分时间我都在想这个:
df = pd.DataFrame({"created_at": ['2019-08-13T12:24:53+00:00', '2019-08-31T13:47:51+00:00'], "selected": [{"982813":False,"1786112":True,"3002218":False}, {"309279":True,"1903384":False}]})

TA贡献1853条经验 获得超6个赞
这是一个向您展示这个想法的微型示例。如果您的音量很大,则不建议:
import pandas as pd
df = pd.DataFrame([[1, {'abc':11}], [2, {'def':22, 'ghi':33}]], columns=['id', 'dct'])
lst = []
for index, row in df.iterrows():
for key, value in row['dct'].items():
lst.append([row['id'], key, value])
new = pd.DataFrame(lst, columns=['id', 'string', 'value'])
print(new)

TA贡献1893条经验 获得超10个赞
在您的情况下,您可以explode在 0.25.0 之后在 pandas中使用
df.BB=df.BB.map(lambda x : list(x.items()))
s=df.explode('BB')
pd.concat([s,pd.DataFrame(s.BB.tolist(),index=s.index)],axis=1)
Out[93]:
CC BB 0 1
0 1 (1, 2) 1 2
0 1 (2, 1) 2 1
1 2 (2, 2) 2 2
1 2 (8, 3) 8 3
1 2 (4, 5) 4 5
数据
df= pd.DataFrame({'CC':[1,2],'BB':[{1:2,2:1},{2:2,8:3,4:5}]})
添加回答
举报