将 Dataframe 的 DataFrame 转换为单个 DataFrame 仅选择某些列 Python

问题描述

我有一个 Json 文件

exchangeInfo = {
    "timezone": "UTC","serverTime": 1565246363776,"rateLimits": [],"exchangeFilters": [],"symbols": [
        {
            "symbol": "ETHBTC","status": "TradING","baseAsset": "ETH","baseAssetPrecision": 8,"quoteAsset": "BTC","quotePrecision": 8,"quoteAssetPrecision": 8,"baseCommissionPrecision": 8,"quoteCommissionPrecision": 8,"filters": [
                {
                    "filterType": "PRICE_FILTER","minPrice": "0.00000100","maxPrice": "100000.00000000","tickSize": "0.00000100",},{
                    "filterType": "PERCENT_PRICE","multiplierUp": "1.3000","multiplierDown": "0.7000","avgPriceMins": 5,{
                    "filterType": "LOT_SIZE","minQty": "0.00100000","maxQty": "100000.00000000","stepSize": "0.00100000",],}

应用下一个代码,我将“过滤器”列转换为列。

df = pd.json_normalize(exchangeInfo["symbols"])
df = pd.concat(
    [
        df,df.pop("filters")
        .apply(lambda x: dict(i for d in x for i in d.items()))
        .apply(pd.Series),axis=1,).drop(columns="filterType")
print(df)

打印:

symbol   status baseAsset  baseAssetPrecision quoteAsset  quotePrecision  quoteAssetPrecision  baseCommissionPrecision  quoteCommissionPrecision    minPrice         maxPrice    tickSize multiplierUp multiplierDown  avgPriceMins      minQty           maxQty    stepSize
0  ETHBTC  TradING       ETH                   8        BTC               8                    8                        8                         8  0.00000100  100000.00000000  0.00000100       1.3000         0.7000             5  0.00100000  100000.00000000  0.00100000

但是,我只想选择其中的 2 个过滤器,按过滤器类型名称,我想要“PRICE_FILTER”和“LOT_SIZE”

解决方法

要仅从“PRICE_FILTER”和“LOT_SIZE”过滤器中获取列,请尝试:

df = pd.json_normalize(exchangeInfo["symbols"])
df = pd.concat(
    [
        df,df.pop("filters")
        .apply(
            lambda x: dict(
                i
                for d in x
                for i in d.items()
                if d["filterType"] in {"PRICE_FILTER","LOT_SIZE"}
            )
        )
        .apply(pd.Series),],axis=1,).drop(columns="filterType")
print(df)

打印:

   symbol   status baseAsset  baseAssetPrecision quoteAsset  quotePrecision  quoteAssetPrecision  baseCommissionPrecision  quoteCommissionPrecision    minPrice         maxPrice    tickSize      minQty           maxQty    stepSize
0  ETHBTC  TRADING       ETH                   8        BTC               8                    8                        8                         8  0.00000100  100000.00000000  0.00000100  0.00100000  100000.00000000  0.00100000
,

您需要列出您想要的过滤器,然后从列表中选择任何一个:

filters = ['PRICE_FILTER','LOT_SIZE']
df = df[df['filters'].str.isin('|'.join(filters))]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...