如何从 JSON 数据框中跳过重复值和空白值并存储到数组中?

Posted

技术标签:

【中文标题】如何从 JSON 数据框中跳过重复值和空白值并存储到数组中?【英文标题】:How to skip duplicates and blank values from JSON dataframe and store into an array? 【发布时间】:2021-09-29 03:05:10 【问题描述】:

以下代码显示来自 JSON Line 文件的数据。

import pandas as pd
import numpy


start = time.time()
with open('stela_zerrl_t01_201222_084053_test_edited.json', 'r') as fin:
    df = pd.read_json(fin, lines=True)
    parsed_data = df[["SRC/Word1"]].drop_duplicates().replace('', np.NAN).dropna().values.tolist()
    
print(parsed_data)



输出是:

[[' '], ['E1F25701'], ['E15511D7']]

有没有办法删除空白数据、重复数据并将其存储为数组?

【问题讨论】:

drop_duplicates 删除重复项,boolean indexing 过滤掉空白行,to_numpy 转换为 numpy 数组 【参考方案1】:

您可以使用.dropna(),.drop_duplicates()

parsed_data=parsed_data.drop.duplicates()
parsed_data.dropna(how='all', inplace = True) 
# do operation inplace your dataframe and return None.

parsed_data= parsed_data.dropna(how='all') 
# don't do operation inplace and return a dataframe as a result. 
# Hence this result must be assigned to your dataframe

如果直接.dropna() 不适合你,那么你可以使用.replace('', numpy.NaN,inplace=True)

或者你也可以试试这个:

json_df=json_df[json_df['SRC/Word1'].str.strip().astype(bool)]

如果你有空字符串,这比.replace() 更快。

现在我们清理了它,我们可以使用.values.tolist() 来获取列表中的值。

【讨论】:

dropna doesn't work 说它不存在。 replace 方法的输出为空白。 @minTwin 我已经告诉过你,inplace=True 不返回任何值! 我得到以下输出:[[''] ['E1F25701'] ['E15511D7']] parsed_data = json_df[["SRC/Word1"]].drop_duplicates().dropna(how = 'all').to_numpy() 产生结果。所有数据都必须在一个数组中。 @minTwin 这样做json_df=json_df[json_df['SRC/Word1'].str.strip().astype(bool)]【参考方案2】:

是的! Pandas 为所有这些操作提供了内置函数:

import pandas as pd
df = pd.read_json('stela_zerrl_t01_201222_084053_test_edited.json', lines=True)
series = df['SRC/Word1']
no_dupes = series.drop_duplicates()
no_blanks = no_dupes.dropna()
final_list = no_blanks.tolist()

如果你想要一个 numpy 数组而不是 python 列表,你可以将最后一行更改为以下内容:

final_array = no_blanks.to_numpy()

【讨论】:

以下出现错误:ValueError: Trailing data @minTwin 啊,所以当您的 JSON 文件中包含多个 JSON 块时,就会发生这种情况。与这篇文章不同的问题:***.com/questions/30088006/… @minTwin 修复了我的答案以使用 lines=True 来防止该错误【参考方案3】:

删除重复项,将空字符串替换为NaN,然后创建列表。

>>> df.drop_duplicates().replace('', np.NAN).dropna().values.tolist()
[['E1F25701'], ['E15511D7']]

PS:由于您拥有的是一个数据框,因此它将是一个 2D 列表,如果您想要 1D 列表,您可以针对特定列进行:

>>> df['SRC/Word1'].drop_duplicates().replace('', np.NAN).dropna().tolist()
['E1F25701', 'E15511D7']

您拥有的不是空字符串,而是空格字符,试试这个:将\s+ 替换为np.NANregex=True

>>>df['SRC/Word1'].drop_duplicates().replace('\s+', np.NAN, regex=True).dropna().tolist()
['E1F25701', 'E15511D7']

显然,下面也可以:

df['SRC/Word1'].drop_duplicates().str.strip().replace('', np.NAN).dropna().tolist()
['E1F25701', 'E15511D7']

【讨论】:

这个输出是:[[''], ['E1F25701'], ['E15511D7']] 有没有办法把所有的数据放到一个数组中? 您能否将输出屏幕截图与我提供的解决方案一起添加到问题中?那不应该是输出。 等一下 好的,我看到了,那不是空字符串而是空格字符,用regex=True尝试答案中的最后一个解决方案 这个肯定可以工作:df['SRC/Word1'].drop_duplicates().str.strip().replace('', np.NAN).dropna().tolist()

以上是关于如何从 JSON 数据框中跳过重复值和空白值并存储到数组中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环中跳过项目

在数组中跳过mysql数据库中的值[重复]

如何在 Moshi 中跳过 JSON 属性?

从 IBAction 调用的 dispatchqueue.main.async 中跳过了 Https 请求

如何从mysql中的表中跳过行

如何在 N-Queen 问题中跳过重复的棋盘状态?