dataframe在分析字典时添加一个额外的行

2024-09-29 22:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

python新手,但我甚至找不到关于这种行为的问题。我有一个作为JSON从GoogleAPI接收的地址,我将它解析成一个dictionary对象,然后在创建数据帧后写入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行数据,但数据框的创建似乎添加了一个空键和一个空值,因此数据框包含17行,而不是我期望的16行

我包括一个测试文件,它只是用数据填充dict,然后将键和值传递到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中…或者是吗

我认为我在创建字典时做错了什么,所以我只是做了一个测试,使用两个可接受的方法初始化了两个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?

显然,这个“东西”是dict对象固有的,熊猫只是想尽可能地利用它。有人知道我如何在不返回并从csv中删除伪行的情况下防止它吗?(,0)在输出数据帧内容之后

这在Python2.7.17中的作用与在3.7.3中的作用相同,因此这似乎不是Python的问题,而是pandas的问题

注:我想pandas可能会选择一个额外的行,以便验证dict只有16行,我添加了对dict.keys()和dict.values()的调用,以查看我是否向dict添加了在其中一个调用中返回的内容,但dict似乎没有正确地返回键和值。熊猫正在创造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

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


Tags: csvto数据对象noneaddstreettype
1条回答
网友
1楼 · 发布于 2024-09-29 22:19:58

TLDR:这不是一个bug,你看到的是一个pd.Series名称。所有系列都有它,因为您没有提供一个,pandas会使用autoincrement自动分配它

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

或者,如果您总是解析单个值的一个dict,只需生成一个序列:

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

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

相关问题 更多 >

    热门问题