R根据条件从json输出中提取字符串/s

2024-05-13 18:43:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用GoogleAPI之后,我试图从json输出中提取某些值。在整个输出中,我希望根据定义的标准提取特定的值。我正在使用的桌子看起来像这样-

^{tb1}$

我希望我的mutate new columns及其结果表为:

^{tb2}$

使用R(首选)或Python,解析值列并提取这些值的好方法是什么

任何帮助都将不胜感激,谢谢!我的大多数结果都是使用excel使用 TRIM MID函数,这并没有给我想要的结果


Tags: columns方法函数jsonnew标准定义excel
2条回答

这是一个使用Python的可行解决方案

逻辑:

  • 使用pd.Dataframe()API输出转换为普通df

  • 使用apply(pd.Series)将“value”列拆分为单独的列

  • 将拆分的列与前面的df合并为concat()

  • drop()删除无用列

代码:

  import pandas as pd
    
  api_output = {'index':[1,2] ,
                'value': [{'city_display_city_name_fg': True, 'subMarket_id': 1631, 'subMarket_tx': 'Southern NH', 'market_id': 644, 'market_tx': 'Southern NH', 'metro_id': 37}, {'city_display_city_name_fg': False, 'subMarket_id': 2464, 'subMarket_tx': 'north NH', 'market_id': 541, 'metro_id': 57}]}
    
  # convert entire API output into pandas df
  api_df = pd.DataFrame(api_output)
    
  # split "value" to columns, concat with previous api_df, drop useless columns
  final_df = pd.concat([api_df, api_df['value'].apply(pd.Series)], axis=1).drop(['city_display_city_name_fg','subMarket_id','subMarket_tx'], axis=1)

结果:

^{tb1}$

您可以从字符串中提取所有值,并只保留所需的列

library(dplyr)
library(tidyr)

df %>%
  mutate(value = gsub('[{}]', '', value)) %>%
  separate_rows(value, sep = ',\\s*') %>%
  separate(value, c('name', 'value'), sep = ':\\s*') %>%
  pivot_wider(names_from = name, values_from = value)

#  index city_display_city_name_fg subMarket_id subMarket_tx market_id market_tx   metro_id
#  <int> <chr>                     <chr>        <chr>        <chr>     <chr>       <chr>   
#1     1 True                      1631         Southern NH  644       Southern NH 37      
#2     2 False                     2464         north NH     541       NA          57      

数据

如果以可复制的格式提供数据,则更容易提供帮助

df <- structure(list(index = 1:2, value = c("{city_display_city_name_fg: True, subMarket_id: 1631, subMarket_tx: Southern NH, market_id: 644, market_tx: Southern NH, metro_id: 37}", 
"{city_display_city_name_fg: False, subMarket_id: 2464, subMarket_tx: north NH, market_id: 541, metro_id: 57}"
)), row.names = c(NA, -2L), class = "data.frame")

相关问题 更多 >