我试图对某些数据进行一些分析,并在解析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
}
我只想提取每个数字(1
,0
,2
)之后的区域信息,然后将结果(zone-7
,zone-2
, zone-12
)在单独的列中。如何使用R或Python做到这一点?
答案 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