【问题标题】:Pandas.dataframe adds an extra row when parsing dictionaryPandas.dataframe 在解析字典时增加了一行
【发布时间】:2020-05-12 21:40:42
【问题描述】:

熊猫版本:1.03 Python 版本:2.7.17、3.7.3 Chromebook - Debian Buster

python 新手,但我什至找不到关于这种行为的问题。我有一个地址,我从谷歌 API 接收为 JSON,我将其解析为字典对象,然后在创建 pandas DataFrame 后写入 csv 文件。 (我不包括从 JSON 转换为 dict 的代码,但如果没有转换,这将是如何完成的。)

add = {'street': 'Farm to Market 369', 'state': 'Texas', 'city': 'Iowa Park', 'county': 'Wichita County', 'country': 'United States', 'postal_code': '76367', 'neighborhood': None, 'sublocality': None, 'housenumber': None, 'postal_town': None, 'subpremise': None, 'latitude': 33.9738616, 'longitude': -98.5964961, 'location_type': 'ROOFTOP', 'postal_code_suffix': None, 'street_number': '2101'}

有 16 行数据,但数据框的创建似乎添加了一个空键和一个空值,因此 DataFrame 包含 17 行,而不是我期望的 16 行。

我包含一个测试文件,它只是用数据填充字典,然后将键和值传递到 pandas.df。查看表格输出。


#!/usr/bin/env python3
import pandas as pd
import dumper

def writeAddressCsv(unitName,add):
    #sv_file_path = dataDir+unitName+"_address.csv"

    print (dumper.dump(add))
    df=pd.DataFrame(add.values(),add.keys())
    print(df)
    exit(0)
    #try:
    #    export_csv = df.to_csv(csv_file_path)
    #except:
    #    print("failed to save  address to " + csv_file_path)


add = {"street": "Farm to Market 369", "state": "Texas", "city": "Iowa Park", "county": "Wichita County", "country": "United States", "postal_code": "76367", "neighborhood": None, "sublocality": None, "housenumber": None, "postal_town": None, "subpremise": None, "latitude": 33.9738616, "longitude": -98.5964961, "location_type": "ROOFTOP", "postal_code_suffix": None, "street_number": "2101"}

writeAddressCsv("foo",add)

                                     0 <-----------(null key and 'None' (null) value???)
street              Farm to Market 369
state                            Texas
city                         Iowa Park
county                  Wichita County
country                  United States
postal_code                      76367
neighborhood                      None
sublocality                       None
housenumber                       None
postal_town                       None
subpremise                        None
latitude                       33.9739
longitude                     -98.5965
location_type                  ROOFTOP
postal_code_suffix                None
street_number                     2101

那个空键不在字典中......或者是吗?

我以为我在创建字典时做错了什么,所以我只是做了一个测试,使用两种可接受的方法初始化两个 dict 对象,一个是空的,一个是我添加数据的方法。两者都在转储程序输出中报告了这个奇怪的“无”,我通常假设它是某种默认行为指示器(默认为空列值或其他东西),但如果我的侦查发现了一些东西,pandas 显然将它视为一个真实的列很重要。

#!/usr/bin/env python3
import dumper


finaldict = dict()
finaldict2 = {"test": "foo","test2":"foo2"}


print ('finaldict is a: '  + str(type(finaldict)))
print ('finaldict2 is a: ' + str(type(finaldict2)))

print (dumper.dump(finaldict))
print (dumper.dump(finaldict2))

这是输出:(我在问什么对象类型,因为在我看来,dumper 输出看起来像是将对象报告为字符串 - 'str at xxxx')。


finaldict is a: <class 'dict'>
finaldict2 is a: <class 'dict'>
<str at 0x79ce5dcb58>: '{}'None <------- wtf mate?
<str at 0x79ce4acce8>: "{'test': 'foo', 'test2': 'foo2'}"None <-------- wtf mate?

显然,这个“东西”是 dict 对象所固有的,pandas 只是想尽其所能。有谁知道我如何在不返回并从我的 csv 中删除虚假行的情况下防止它? ( ,0) 数据帧内容输出后?

这在 Python 2.7.17 中的作用与在 3.7.3 中的作用相同,因此这似乎不是 python 的问题,而是 pandas 的问题。

PS.:我想也许 pandas 会增加一行,所以为了验证 dict 是否只有 16 行,我添加了对 dict.keys() 和 dict.values() 的调用,以查看我是否添加了一些东西到它在其中一个调用中返回的字典,但没有字典似乎正确返回键和值。 Pandas 正在创造 17!

Number of Keys: 16
dict_keys(['street', 'state', 'city', 'county', 'country', 'postal_code', 'neighborhood', 'sublocality', 'housenumber', 'postal_town', 'subpremise', 'latitude', 'longitude', 'location_type', 'postal_code_suffix', 'street_number'])
Number of values: 16
dict_values(['Farm to Market 369', 'Texas', 'Iowa Park', 'Wichita County', 'United States', '76367', None, None, None, None, None, 33.9738616, -98.5964961, 'ROOFTOP', None, '2101'])

PSS:

这可能是相关的,但没有答案。

Pandas adding extra row to DataFrame when assigning index

这是熊猫错误还是我做错了什么?

【问题讨论】:

    标签: python pandas dictionary


    【解决方案1】:

    TLDR:这不是错误,您看到的是 pd.Series 名称。所有系列都有它,由于您没有提供,pandas 使用自动增量自动分配它。

    pd.DataFrame 中的列和行都是pd.Series。您将值和索引传递给构造函数,但没有传递列,因此使用默认名称来命名列系列(即自动增量)。您可以手动指定列名,例如:

    df=pd.DataFrame(add.values(), add.keys(), columns=['Address'])
    # btw, I'm not sure if dict values and keys are guaranteed to be in the same order
    

    或者,如果您总是解析单个值的一个字典,只需制作一个系列:

    s = pd.Series(add, name='Address')
    

    如果您检查数据帧的长度,它将与字典长度相同。

    【讨论】:

    • 谢谢。文档没有强制要求(显然代码也没有),并且代码没有警告它,所以我没有得到它。您的解决方案效果很好。
    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 2021-07-15
    • 2014-03-30
    • 1970-01-01
    • 2023-03-24
    • 2020-03-18
    • 2019-10-12
    相关资源
    最近更新 更多