Python - 将键值对解析为 DataFrame 列的函数
Python - Function for parsing key-value pairs into DataFrame columns
我在 CSV 文件中有一个包含键值对的数据集,看起来与此类似:
"1, {""key"": ""construction_year"", ""value"": 1900}, {""key"": ""available_date"", ""value"": ""Vereinbarung""}"
"2, {""key"": ""available_date"", ""value"": ""01.04.2022""}, {""key"": ""useful_area"", ""value"": 60.0}"
"3, {""key"": ""construction_year"", ""value"": 2020}, {""key"": ""available_date"", ""value"": ""sofort""}"
"4, {""key"": ""available_date"", ""value"": ""Vereinbarung""}, {""key"": ""wheelchair_accessible"", ""value"": true}"
我的预期输出如下:
id construction_year available_date useful_area wheelchair_accessible
1 1900 Vereinbarung nan nan
2 nan 01.04.202 60.0 nan
3 2020 sofort nan nan
4 nan Vereinbarung nan true
我已经尝试使用 json.loads
将此数据转换为 dict
,然后对其进行解析。当我可以确保所有行都以 JSON 样式完美格式化时,此方法适用于小规模。
但是,当我尝试在具有 200'000 个观察值的 list
上使用 json.loads
时,我总是会遇到一些错误,因为并非所有行都采用正确的 JSON 格式.例如,有时“键”中缺少“值”,有时 {
放在错误的地方,因此 json.loads
导致以下错误: JSONDecodeError: Expecting property name enclosed in double quotes
几天来我一直在尝试将整个数据修复为 JSON 友好的格式,但这似乎是不可能的,我收到的这个数据集格式很糟糕而且非常混乱。
所以我想知道是否有人可以想出一个函数,让我可以将键值对拆分成单独的列,而不必使用 json.loads
.
提前致谢。
看起来有人抓取 JavaScript 代码并保存为 CSV 字符串。
"1, {""key"": ""construction_year"", ""value"": 1900}, {""key"": ""available_date"", ""value"": ""Vereinbarung""}"
它需要将 CSV 字符串转换回普通字符串,然后再对其进行解析。
或者它需要更改行中的文本以更正 JSON 数据
[1, {"key": "construction_year", "value": 1900}, {"key": "available_date", "value": "Vereinbarung"}]
可以转换为3列。
稍后您可以将字典转换为一本字典
[1, {'construction_year': 1900, 'available_date': 'Vereinbarung'}]
可以使用 pandas
和 .apply(pd.Series)
转换为列
我使用 text
作为字符串,但您可以从文件中读取它
text = '''"1, {""key"": ""construction_year"", ""value"": 1900}, {""key"": ""available_date"", ""value"": ""Vereinbarung""}"
"2, {""key"": ""available_date"", ""value"": ""01.04.2022""}, {""key"": ""useful_area"", ""value"": 60.0}"
"3, {""key"": ""construction_year"", ""value"": 2020}, {""key"": ""available_date"", ""value"": ""sofort""}"
"4, {""key"": ""available_date"", ""value"": ""Vereinbarung""}, {""key"": ""wheelchair_accessible"", ""value"": true}"
'''
import pandas as pd
#text = open('data.csv').read()
rows = []
for line in text.splitlines():
line = line.replace('""', '"')
line = '[' + line[1:-1] + ']'
line = json.loads(line)
item = {}
for d in line[1:]:
key = d['key']
val = d['value']
item[key] = val
rows.append( [line[0], item] )
df = pd.DataFrame(rows, columns=['id', 'data'])
# convert dictionaries to columns
df = df.join(df['data'].apply(pd.Series))
# remove column with dictionaries
del df['data']
print(df.to_string())
结果:
id construction_year available_date useful_area wheelchair_accessible
0 1 1900.0 Vereinbarung NaN NaN
1 2 NaN 01.04.2022 60.0 NaN
2 3 2020.0 sofort NaN NaN
3 4 NaN Vereinbarung NaN True
我在 CSV 文件中有一个包含键值对的数据集,看起来与此类似:
"1, {""key"": ""construction_year"", ""value"": 1900}, {""key"": ""available_date"", ""value"": ""Vereinbarung""}"
"2, {""key"": ""available_date"", ""value"": ""01.04.2022""}, {""key"": ""useful_area"", ""value"": 60.0}"
"3, {""key"": ""construction_year"", ""value"": 2020}, {""key"": ""available_date"", ""value"": ""sofort""}"
"4, {""key"": ""available_date"", ""value"": ""Vereinbarung""}, {""key"": ""wheelchair_accessible"", ""value"": true}"
我的预期输出如下:
id construction_year available_date useful_area wheelchair_accessible
1 1900 Vereinbarung nan nan
2 nan 01.04.202 60.0 nan
3 2020 sofort nan nan
4 nan Vereinbarung nan true
我已经尝试使用 json.loads
将此数据转换为 dict
,然后对其进行解析。当我可以确保所有行都以 JSON 样式完美格式化时,此方法适用于小规模。
但是,当我尝试在具有 200'000 个观察值的 list
上使用 json.loads
时,我总是会遇到一些错误,因为并非所有行都采用正确的 JSON 格式.例如,有时“键”中缺少“值”,有时 {
放在错误的地方,因此 json.loads
导致以下错误: JSONDecodeError: Expecting property name enclosed in double quotes
几天来我一直在尝试将整个数据修复为 JSON 友好的格式,但这似乎是不可能的,我收到的这个数据集格式很糟糕而且非常混乱。
所以我想知道是否有人可以想出一个函数,让我可以将键值对拆分成单独的列,而不必使用 json.loads
.
提前致谢。
看起来有人抓取 JavaScript 代码并保存为 CSV 字符串。
"1, {""key"": ""construction_year"", ""value"": 1900}, {""key"": ""available_date"", ""value"": ""Vereinbarung""}"
它需要将 CSV 字符串转换回普通字符串,然后再对其进行解析。
或者它需要更改行中的文本以更正 JSON 数据
[1, {"key": "construction_year", "value": 1900}, {"key": "available_date", "value": "Vereinbarung"}]
可以转换为3列。
稍后您可以将字典转换为一本字典
[1, {'construction_year': 1900, 'available_date': 'Vereinbarung'}]
可以使用 pandas
和 .apply(pd.Series)
我使用 text
作为字符串,但您可以从文件中读取它
text = '''"1, {""key"": ""construction_year"", ""value"": 1900}, {""key"": ""available_date"", ""value"": ""Vereinbarung""}"
"2, {""key"": ""available_date"", ""value"": ""01.04.2022""}, {""key"": ""useful_area"", ""value"": 60.0}"
"3, {""key"": ""construction_year"", ""value"": 2020}, {""key"": ""available_date"", ""value"": ""sofort""}"
"4, {""key"": ""available_date"", ""value"": ""Vereinbarung""}, {""key"": ""wheelchair_accessible"", ""value"": true}"
'''
import pandas as pd
#text = open('data.csv').read()
rows = []
for line in text.splitlines():
line = line.replace('""', '"')
line = '[' + line[1:-1] + ']'
line = json.loads(line)
item = {}
for d in line[1:]:
key = d['key']
val = d['value']
item[key] = val
rows.append( [line[0], item] )
df = pd.DataFrame(rows, columns=['id', 'data'])
# convert dictionaries to columns
df = df.join(df['data'].apply(pd.Series))
# remove column with dictionaries
del df['data']
print(df.to_string())
结果:
id construction_year available_date useful_area wheelchair_accessible
0 1 1900.0 Vereinbarung NaN NaN
1 2 NaN 01.04.2022 60.0 NaN
2 3 2020.0 sofort NaN NaN
3 4 NaN Vereinbarung NaN True