【问题标题】:How to skip duplicates and blank values from JSON dataframe and store into an array?如何从 JSON 数据框中跳过重复值和空白值并存储到数组中?
【发布时间】: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']]

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

【问题讨论】:

标签: python json pandas


【解决方案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 块时,就会发生这种情况。与这篇文章不同的问题:stackoverflow.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()
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
相关资源
最近更新 更多