从CSV文件中的数据字符串中提取信息

时间:2019-07-25 05:18:53

标签: python r excel

我试图对某些数据进行一些分析,并在解析csv文件中的数据时遇到一些问题。

这是一个单元格中的原始数据:

{"completed": true, "attempts": 1, "item_state": {"1": {"correct": true, "zone": "zone-7"}, "0": {"correct": true, "zone": "zone-2"}, "2": {"correct": true, "zone": "zone-12"}}, "raw_earned": 1.0}

为清楚起见而格式化:

{
  "completed": true,
  "attempts": 1,
  "item_state": {
    "1": {
      "correct": true,
      "zone": "zone-7"
    },
    "0": {
      "correct": true,
      "zone": "zone-2"
    },
    "2": {
      "correct": true,
      "zone": "zone-12"
    }
  },
  "raw_earned": 1.0
}

我只想提取每个数字(102)之后的区域信息,然后将结果(zone-7zone-2zone-12)在单独的列中。如何使用R或Python做到这一点?

8 个答案:

答案 0 :(得分:1)

它看起来像一个字典,当它作为元素存储在csv中时,它作为字符串存储。在python中,您可以使用ast.literal_Eval()。它将字符串解析为python ic数据类型,例如列表,字典等。还可以用作数据类型解析器。

如果您提到的单元格索引为[i,j]

import pandas as pd    
import ast
df = pd.read_csv(filename)
a = ast.literal_eval(df.loc[i][j])
b = pd.io.json.json_normalize(a)
output = []
for i in range(df.shape[0]):
  c = ast.literal_eval(df.iloc[i][j])
  temp = pd.DataFrame({'key':c['item_state'].keys(),'zone':[x['zone'] for x in c['item_state'].values()]})
  temp['row_n'] = i
  output.append(temp)
output2 = pd.concat(temp)

如果[i,j]是您的手机, 上面代码中的a是您的示例中给出的字典。 b是一个扁平化的字典,包含输出中的所有键值对。

其余代码仅提取区域值。 如果您希望将其应用于多个单元格,请使用循环,否则请仅使用循环内的内容。 输出是一个列表数据帧,每个数据帧都具有item_state键和zone值作为列,还有row_number以便标识。 output2是连接的数据帧。

ast-抽象语法树

答案 1 :(得分:0)

将单元格值转换为JSON,然后您可以访问想要的任何元素:

import csv
import json

column_index = 0
state_keys = ['1', '0', '2']
with open('data.csv') as f:
    reader = csv.reader(f, delimiter=';')
    for row in reader:
        object = json.loads(row[column_index])
        state = object['item_state']
        # Show all values under item_state in order they appear:
        for key, value in state.items():
            print(state[key]['zone'])
        # Show only state_keys defined in variable in order they are defined in a list
        for key in state_keys:
            print(state[key]['zone'])

答案 2 :(得分:0)

在Python中,您可以使用json库执行以下操作:

d = json.loads(raw_cell_data)  # Load the data into a Python dict
results = {}
for key, value in d['item_state'].items():
    results[key] = value['zone']

然后您可以使用results打印到CSV。

答案 3 :(得分:0)

最初的情况还不清楚,您显示的内容看起来像json,但您提到的是csv。

假设您有一个csv,其中各个字段是包含json数据的字符串,则可以使用csv和json包提取区域信息。

设置一个for循环以迭代csv(see csv docs for more detail)的行 然后使用json模块从字符串中提取区域。

import csv
import json

# to get ss from a csv:
# my_csv = csv.reader( ... )
# for row in my_csv:
#     ss = row[N]

ss = '{"completed": true, "attempts": 1, "item_state": {"1": {"correct": true, "zone": "zone-7"}, "0": {"correct": true, "zone": "zone-2"}, "2": {"correct": true, "zone": "zone-12"}}, "raw_earned": 1.0}'

jj = json.loads(ss)

for vv in jj['item_state'].values():
    print(vv['zone'])

答案 4 :(得分:0)

类似这样的东西。没有测试,因为您没有提供足够的样本。

import csv
import json

with open('data.csv') as fr:
    rows = list(csv.reader(fr))

for row in rows:
    data = json.loads(row[0])
    new_col_data = [v['zone'] for v in data['item_state'].values()]
    row.append(", ".join(new_col_data)


with open('new_data.csv', 'w') as fw:
    writer = csv.writer(fw)
    writer.writerows(rows)

答案 5 :(得分:0)

在Python中,看起来每个单元格数据都是一个字典,还包含字典,即nested dictionaries

如果此单元格的数据被引用为变量cell_data,则可以使用以下命令进入内部的“ item_state”字典:

cell_data["item_state"]

这将返回

{"1": {"correct": true, "zone": "zone-7"}, "0": {"correct": true, "zone": "zone-2"}, "2": {"correct": true, "zone": "zone-12"}}

然后,您可以通过请求“ 1”字典来更深一层地执行相同的操作:

cell_data["item_state"]["1"]

返回:

{'correct': 'true', 'zone': 'zone-7'}

再一次:

cell_data["item_state"]["1"]["zone"]

返回

'zone-7'

因此,将它们整合在一起,您可以通过以下操作获得所需的内容:

your_list = list( cell_data["item_state"][i]['zone'] for i in ["1","0","2"] )

返回:

['zone-7', 'zone-2', 'zone-12']

答案 6 :(得分:0)

在R包h(s)=y中,函数rjson易于使用。
以下任何读取JSON字符串的方式都会产生相同的结果。

fromJSON

library("rjson") x <- '{"completed": true, "attempts": 1, "item_state": {"1": {"correct": true, "zone": "zone-7"}, "0": {"correct": true, "zone": "zone-2"}, "2": {"correct": true, "zone": "zone-12"}}, "raw_earned": 1.0}' json <- fromJSON(json_str = x) # if the string is in a file, say, "so.json" #json <- fromJSON(file = "so.json") 是类json的对象,使用它创建一个数据框。

"list"

答案 7 :(得分:0)

获取item_state并找到一个zone值,然后将键和值附加到空列表,最后用这些列表创建新列

zone_val = []
zone_key = []

for k,v in d['item_state'].items():
    zone_val.append(v['zone'])
    zone_key.append(k)

DF[zone_key] = zone_key
DF[zone_val] = zone_val