Pandas.dataframe在解析字典时增加了一个额外的行



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

python 新手,但我甚至找不到有关此行为的问题。我有一个从谷歌 API 以 JSON 形式接收的地址,我将其解析为字典对象,然后在创建熊猫数据帧后写入 csv 文件。(我没有包括从 JSON 转换为字典的代码,但如果没有转换,这就是完成的方式。

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 行数据,但数据帧的创建似乎添加了空键和空值,因此数据帧包含 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 对象,一个是空的,一个是我添加数据的。两者都在转储器输出中报告了这个奇怪的"无",我通常只是认为这是某种默认行为指示器(默认为空列值或其他东西(,但如果我的侦查发现了一些重要的东西,熊猫显然将其视为真正的列。

#!/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))

这是输出:(我问什么对象类型,因为在我看来,转储器输出看起来像是将对象报告为字符串 - '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?

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

这在 Python 2.7.17 中的行为方式与在 3.7.3 中相同,因此这似乎不是 python 的问题,而是熊猫的问题。

PS.:我想也许熊猫正在选择额外的行,所以为了验证字典只有 16 行,我添加了对 dict.keys(( 和 dict.values(( 的调用,看看我是否在字典中添加了一些东西它在其中一个调用中返回,但没有字典似乎正确返回键和值。熊猫正在创造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:

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

熊猫在分配索引时向数据帧添加额外的行

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

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

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

或者,如果您总是解析单个值的一个字典,只需创建一个 Series:

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

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

最新更新