如何从 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.NAN
与regex=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 数据框中跳过重复值和空白值并存储到数组中?的主要内容,如果未能解决你的问题,请参考以下文章