如何将一行中的字典列表拆分为多行Panda DataFrame



我有以下数据帧:

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

explodeperiods并应用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.

最新更新