我有以下数据帧:
terms periods
0 [741880, 3764106] [{"name":"2010 год", "date":"31.12.2010", "value":"6621"},{"name":"2000 год", "date":"31.12.2000", "value":"17913"},{"name":"2006 год", "date":"31.12.2006", "value":"5849"},{"name":"2003 год", "date":"31.12.2003", "value":"9211"},{"name":"2012 год", "date":"31.12.2012", "value":"7647"},{"name":"2011 год", "date":"31.12.2011", "value":"8382"},{"name":"2014 год", "date":"31.12.2014", "value":"7388"},{"name":"2004 год", "date":"31.12.2004", "value":"8851"}]
正如您所看到的,它在行中有一个字典列表。现在我想要一些类似的东西:
terms date value
0 [741880, 3764106] 31.12.2010 6621
1 [741880, 3764106] 31.12.2000 17913
2 [741880, 3764106] 31.12.2006 5849
etc
因此,字典列表必须根据列表中元素的数量划分为多行。
我该怎么做?
尝试使用apply()
和explode()
:
df2 = (df['periods'].apply(lambda x: [[i['date'],i['value']] for i in x])
.explode()
.apply(pd.Series, index=['date','value'])])
df = pd.concat([df['terms'], df2, axis=1).reset_index(drop=True)
输出:
print(df)
terms date value
0 [741880, 3764106] 31.12.2010 6621
1 [741880, 3764106] 31.12.2000 17913
2 [741880, 3764106] 31.12.2006 5849
3 [741880, 3764106] 31.12.2003 9211
4 [741880, 3764106] 31.12.2012 7647
5 [741880, 3764106] 31.12.2011 8382
6 [741880, 3764106] 31.12.2014 7388
7 [741880, 3764106] 31.12.2004 8851
只explode
列periods
并应用ps.Series
。如果列periods
中的数据已经是字典列表,则可以跳过前两行。使用设置重置索引保留术语列
import ast
df['periods']=df['periods'].apply(ast.literal_eval)
df.set_index('terms').explode('periods').apply(lambda row: pd.Series(row['periods']), axis=1).reset_index()
输出:
terms name date value
0 [741880, 3764106] 2010 год 31.12.2010 6621
1 [741880, 3764106] 2000 год 31.12.2000 17913
2 [741880, 3764106] 2006 год 31.12.2006 5849
3 [741880, 3764106] 2003 год 31.12.2003 9211
4 [741880, 3764106] 2012 год 31.12.2012 7647
5 [741880, 3764106] 2011 год 31.12.2011 8382
6 [741880, 3764106] 2014 год 31.12.2014 7388
7 [741880, 3764106] 2004 год 31.12.2004 8851
试试这个:-
periods = [{"name":"2010 год", "date":"31.12.2010", "value":"6621"},{"name":"2000 год", "date":"31.12.2000", "value":"17913"},{"name":"2006 год", "date":"31.12.2006", "value":"5849"},{"name":"2003 год", "date":"31.12.2003", "value":"9211"},{"name":"2012 год", "date":"31.12.2012", "value":"7647"},{"name":"2011 год", "date":"31.12.2011", "value":"8382"},{"name":"2014 год", "date":"31.12.2014", "value":"7388"},{"name":"2004 год", "date":"31.12.2004", "value":"8851"}]
print(f"{'Terms': <8}{'Name': <13}{'Date': <14}{'Value': <10}")
i = 0
for mem in periods:
for rel in mem:
print(f"{i: <8}{mem['name']:12}{mem['date']: <14}{mem['value']:6}")
i += 1
输出:-
Terms Name Date Value
0 2010 год 31.12.2010 6621
1 2010 год 31.12.2010 6621
2 2010 год 31.12.2010 6621
3 2000 год 31.12.2000 17913
4 2000 год 31.12.2000 17913
5 2000 год 31.12.2000 17913
6 2006 год 31.12.2006 5849
7 2006 год 31.12.2006 5849
8 2006 год 31.12.2006 5849
etc.