【问题标题】:Passing a defaultdict into a df将 defaultdict 传递给 df
【发布时间】:2019-12-21 06:58:00
【问题描述】:

我正在尝试导入一个 txt 文件,其中列出了州和大学。我已经使用 defaultdict 导入 txt 并将其解析到我有一个列表的位置,其中大学附属于该州。然后如何将数据放入具有两列(State、RegionName)的 pandas 数据框中?到目前为止没有任何效果。

我构建了一个空数据框:

ut = pd.DataFrame(columns = {'State', 'RegionName'})

并尝试了几种不同的方法,但都没有奏效。

with open('ut.txt') as ut:
    for line in ut:
        if '[edit]' in line:
            a = line.rstrip().split('[')
            d[a[0]].append(a[1])
        else:
            b = line.rstrip().split(' ')
            d[a[0]].append(b[0])
        continue

这给了我一个很好的清单:

defaultdict(<class 'list'>, {'State': ['edit]', 'School', 'School2', 'School3', 'School4', 'School5', 'School6', 'School7', 'School8'],

edit] 是原始 txt 文件的一部分,表示一个状态。之后的一切都是学校所在的城镇。

我想构建一个不错的 2 列数据框,其中状态是左列,所有学校都在右列...

【问题讨论】:

  • 我试过这个:df = pd.DataFrame([(k, v[1]) for k, v in d.items()], columns=['State', 'RegionName'] ) 但它给了我一个州和一所学校,然后跳到下一个州。如何遍历所有学校?
  • 欢迎来到 SO!我建议您编辑您的问题以处理格式以使其更具可读性。查看how to format
  • 解决了:new_df = pd.DataFrame(df.RegionName.tolist(), index=df.State).stack() new_df = new_df.reset_index([0, 'State']) new_df .columns = ['State', 'RegionName']
  • 感谢 technogeek1995 的编辑。下次改正。

标签: python pandas dataframe dictionary defaultdict


【解决方案1】:

考虑以下字典

data_dict = {"a": 1, "b": 2, "c": 3}

考虑到您希望从该字典中创建一个数据框并将列分别命名为 StateRegionName,以下将完成工作

data_items = data_dict.items()

data_list = list(data_items)

df = pd.DataFrame(data_list, columns = ["State", "RegionName"])

会得到什么

[In]: print(df) 
[Out]:
  State  RegionName
0     a           1
1     b           2
2     c           3

如果在创建数据框时没有传递列的名称,考虑到列的名称为ab,可以将列重命名为pandas.DataFrame.rename

df = df.rename(columns = {"a": "State", "b": "RegionName"})

如果目标只是读取具有这样结构的 txt 文件

column1 column2
1 2
3 4
5 6 

那么下面的工作就完成了

colnames=['State', 'RegionName'] 

df = pd.read_csv("file.txt", colnames, header=None) 

请注意,如果列的名称已经是想要使用的列,则只需使用以下名称

df = pd.read_csv("file.txt") 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2019-08-21
    • 1970-01-01
    • 2017-06-25
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多