[英]Pandas.dataframe adds an extra row when parsing dictionary
Pandas 版本:1.03 Python 版本:2.7.17、3.7.3 Chromebook - Debian Buster
python 的新手,但我什至找不到关于这种行为的问题。 I have an address I am receiving as JSON from a google API which I parse into a dictionary object and then write to a csv file after creating a pandas DataFrame. (我不包括从 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 的创建似乎添加了一个空键和一个 null 值,因此 ZBA834BA059A9A379459C112175EB8164Z 包含 17 行而不是预期的。
我包括一个测试文件,它只是用数据填充字典,然后将键和值传递到 pandas.df。 查看表格 output。
#!/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
那个 null 键不在字典中……或者是吗?
我以为我在创建字典时做错了,所以我只是做了一个测试,使用两种接受的方法初始化两个 dict 对象,一个是空的,一个是我添加数据的。 两者都在自卸车 output 中报告了这个奇怪的“无”,我通常认为这是某种默认行为指示器(默认为空列值或其他值),但 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))
这是 output :(我在问什么 object 类型,因为自卸车 output 在我看来就像将对象报告为字符串 - '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?
显然,这个“东西”是字典 object 所固有的,而 pandas 只是想尽其所能。 有谁知道如何在不返回并从 csv 中移除虚假线路的情况下防止它发生? (,0) 后 dataframe 的内容已经是 output?
这在 Python 2.7.17 中的作用与在 3.7.3 中的作用相同,因此这似乎不是 python 的问题,而是 Z3A43B4F88325D94022C0EFAAZC2FA2F5
PS.:我想也许 pandas 正在拾取额外的行,以便验证字典只有 16 行,我添加了对 dict.keys() 和 dict.values() 的调用,以查看我是否在 dict 中添加了一些东西它在其中一个调用中返回,但没有,dict 似乎正确返回键和值。 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'])
附言:
这可能是相关的,但没有答案。
Pandas 在分配索引时向 DataFrame 添加额外的行
这是 pandas 错误还是我做错了什么?
TLDR:这不是错误,您看到的是 pd.Series 名称。 所有系列都有它,由于您没有提供它,因此 pandas 使用自动增量自动分配它。
pd.Series
pd.DataFrame
您将值和索引传递给构造函数,但没有传递列,因此使用默认名称来命名列系列(即自动增量)。 您可以手动指定列名,例如:
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')
如果您检查 dataframe 的长度,它将与 dict 长度相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.