简体   繁体   English

使用键作为列将字典列表转换为 Pandas DataFrame

[英]Convert List of Dictionaries into Pandas DataFrame using keys as columns

I have a list of dictionaries of market data below, how do I convert it into a Pandas DataFrame using its keys as columns/我在下面有一个市场数据字典列表,如何使用它的键作为列/

[
    '{"level":0,"side":"Ask","price":"13745.75000","volume":"2"}',
    '{"level":1,"side":"Ask","price":"13745.50000","volume":"5"}',
    '{"level":2,"side":"Ask","price":"13745.25000","volume":"6"}',
    '{"level":3,"side":"Ask","price":"13745.00000","volume":"15"}',
    '{"level":4,"side":"Ask","price":"13744.75000","volume":"4"}',
    '{"level":5,"side":"Ask","price":"13744.50000","volume":"5"}',
    '{"level":6,"side":"Ask","price":"13744.25000","volume":"3"}',
    '{"level":7,"side":"Ask","price":"13744.00000","volume":"3"}',
    '{"level":8,"side":"Ask","price":"13743.75000","volume":"2"}',
    '{"level":9,"side":"Ask","price":"13743.50000","volume":"1"}',
    '{"level":10,"side":"Bid","price":"13743.00000","volume":"2"}',
    '{"level":11,"side":"Bid","price":"13742.75000","volume":"4"}',
    '{"level":12,"side":"Bid","price":"13742.50000","volume":"3"}',
    '{"level":13,"side":"Bid","price":"13742.25000","volume":"4"}',
    '{"level":14,"side":"Bid","price":"13742.00000","volume":"4"}',
    '{"level":15,"side":"Bid","price":"13741.75000","volume":"4"}',
    '{"level":16,"side":"Bid","price":"13741.50000","volume":"4"}',
    '{"level":17,"side":"Bid","price":"13741.25000","volume":"4"}',
    '{"level":18,"side":"Bid","price":"13741.00000","volume":"4"}',
    '{"level":19,"side":"Bid","price":"13740.75000","volume":"2"}',
]

You have a list of string representation of dicts.你有一个字典的字符串表示列表。 It is easier to convert to pandas dataframe if you can convert it to list of dicts.如果您可以将其转换为字典列表,则更容易转换为 pandas dataframe。

For that you can use ast.literal_eval which is safer than plain eval like this为此,您可以使用ast.literal_eval ,它比像这样的普通eval更安全

from ast import literal_eval

data = ['{"level":0,"side":"Ask","price":"13745.75000","volume":"2"}', '{"level":1,"side":"Ask","price":"13745.50000","volume":"5"}', '{"level":2,"side":"Ask","price":"13745.25000","volume":"6"}', '{"level":3,"side":"Ask","price":"13745.00000","volume":"15"}', '{"level":4,"side":"Ask","price":"13744.75000","volume":"4"}', '{"level":5,"side":"Ask","price":"13744.50000","volume":"5"}', '{"level":6,"side":"Ask","price":"13744.25000","volume":"3"}', '{"level":7,"side":"Ask","price":"13744.00000","volume":"3"}', '{"level":8,"side":"Ask","price":"13743.75000","volume":"2"}', '{"level":9,"side":"Ask","price":"13743.50000","volume":"1"}', '{"level":10,"side":"Bid","price":"13743.00000","volume":"2"}', '{"level":11,"side":"Bid","price":"13742.75000","volume":"4"}', '{"level":12,"side":"Bid","price":"13742.50000","volume":"3"}', '{"level":13,"side":"Bid","price":"13742.25000","volume":"4"}', '{"level":14,"side":"Bid","price":"13742.00000","volume":"4"}', '{"level":15,"side":"Bid","price":"13741.75000","volume":"4"}', '{"level":16,"side":"Bid","price":"13741.50000","volume":"4"}', '{"level":17,"side":"Bid","price":"13741.25000","volume":"4"}', '{"level":18,"side":"Bid","price":"13741.00000","volume":"4"}', '{"level":19,"side":"Bid","price":"13740.75000","volume":"2"}']

data_new = [literal_eval(i) for i in data]

Output will look like this, Output 看起来像这样,

[{'level': 0, 'side': 'Ask', 'price': '13745.75000', 'volume': '2'},
 {'level': 1, 'side': 'Ask', 'price': '13745.50000', 'volume': '5'},
 {'level': 2, 'side': 'Ask', 'price': '13745.25000', 'volume': '6'},
 {'level': 3, 'side': 'Ask', 'price': '13745.00000', 'volume': '15'},
 {'level': 4, 'side': 'Ask', 'price': '13744.75000', 'volume': '4'},
 {'level': 5, 'side': 'Ask', 'price': '13744.50000', 'volume': '5'},
 {'level': 6, 'side': 'Ask', 'price': '13744.25000', 'volume': '3'},
 {'level': 7, 'side': 'Ask', 'price': '13744.00000', 'volume': '3'},
 {'level': 8, 'side': 'Ask', 'price': '13743.75000', 'volume': '2'},
 {'level': 9, 'side': 'Ask', 'price': '13743.50000', 'volume': '1'},
 {'level': 10, 'side': 'Bid', 'price': '13743.00000', 'volume': '2'},
 {'level': 11, 'side': 'Bid', 'price': '13742.75000', 'volume': '4'},
 {'level': 12, 'side': 'Bid', 'price': '13742.50000', 'volume': '3'},
 {'level': 13, 'side': 'Bid', 'price': '13742.25000', 'volume': '4'},
 {'level': 14, 'side': 'Bid', 'price': '13742.00000', 'volume': '4'},
 {'level': 15, 'side': 'Bid', 'price': '13741.75000', 'volume': '4'},
 {'level': 16, 'side': 'Bid', 'price': '13741.50000', 'volume': '4'},
 {'level': 17, 'side': 'Bid', 'price': '13741.25000', 'volume': '4'},
 {'level': 18, 'side': 'Bid', 'price': '13741.00000', 'volume': '4'},
 {'level': 19, 'side': 'Bid', 'price': '13740.75000', 'volume': '2'}]

As you can see it is a list of dicts.如您所见,它是一个字典列表。 Pandas can work on it easily. Pandas 可以轻松处理它。 For converting to pandas dataframe do this,要转换为 pandas dataframe,请执行此操作,

df = pd.DataFrame(data_new)

    level   side    price   volume
0   0   Ask 13745.75000 2
1   1   Ask 13745.50000 5
2   2   Ask 13745.25000 6
3   3   Ask 13745.00000 15
4   4   Ask 13744.75000 4
5   5   Ask 13744.50000 5
6   6   Ask 13744.25000 3
7   7   Ask 13744.00000 3
8   8   Ask 13743.75000 2
9   9   Ask 13743.50000 1
10  10  Bid 13743.00000 2
11  11  Bid 13742.75000 4
12  12  Bid 13742.50000 3
13  13  Bid 13742.25000 4
14  14  Bid 13742.00000 4
15  15  Bid 13741.75000 4
16  16  Bid 13741.50000 4
17  17  Bid 13741.25000 4
18  18  Bid 13741.00000 4
19  19  Bid 13740.75000 2

You can set level as index too if needed by doing,如果需要,您也可以将级别设置为索引,

df = pd.DataFrame(df_new).set_index("level")
data=['{"level":0,"side":"Ask","price":"13745.75000","volume":"2"}', '{"level":1,"side":"Ask","price":"13745.50000","volume":"5"}', '{"level":2,"side":"Ask","price":"13745.25000","volume":"6"}', '{"level":3,"side":"Ask","price":"13745.00000","volume":"15"}', '{"level":4,"side":"Ask","price":"13744.75000","volume":"4"}', '{"level":5,"side":"Ask","price":"13744.50000","volume":"5"}', '{"level":6,"side":"Ask","price":"13744.25000","volume":"3"}', '{"level":7,"side":"Ask","price":"13744.00000","volume":"3"}', '{"level":8,"side":"Ask","price":"13743.75000","volume":"2"}', '{"level":9,"side":"Ask","price":"13743.50000","volume":"1"}', '{"level":10,"side":"Bid","price":"13743.00000","volume":"2"}', '{"level":11,"side":"Bid","price":"13742.75000","volume":"4"}', '{"level":12,"side":"Bid","price":"13742.50000","volume":"3"}', '{"level":13,"side":"Bid","price":"13742.25000","volume":"4"}', '{"level":14,"side":"Bid","price":"13742.00000","volume":"4"}', '{"level":15,"side":"Bid","price":"13741.75000","volume":"4"}', '{"level":16,"side":"Bid","price":"13741.50000","volume":"4"}', '{"level":17,"side":"Bid","price":"13741.25000","volume":"4"}', '{"level":18,"side":"Bid","price":"13741.00000","volume":"4"}', '{"level":19,"side":"Bid","price":"13740.75000","volume":"2"}']

import pandas as pd

You can use:您可以使用:

df=pd.Series(data)

Finally make use of apply() and eval() :最后使用apply()eval()

df=df.apply(lambda x:eval(x))

data=df.tolist()

Finally:最后:

df=pd.DataFrame(data).set_index('level')

Now if you print df you will get your desired output现在如果你打印df你会得到你想要的 output

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM