【问题标题】:Dictionary of Dataframes from existing Data frames来自现有数据框的数据框字典
【发布时间】:2018-12-11 22:22:24
【问题描述】:

我有以下代码用于使用 csv 文件创建数据框字典:

l = ['employees','positions']
d = {}
for x in l:
    d[x] = pd.read_csv("P:\\python_work\\data_sets\\" + x + ".csv")

如何使用内存中已经存在的数据框列表来做同样的事情?

这不起作用,但也许它有助于澄清我正在尝试做的事情:

l = ['df1','df2']
d = {}
for x in l:
    d[x] = x

然后我就可以像这样访问单个数据帧:

d['df1']

我使用 csv 文件提供了示例,因为它可以工作并且具有相同的最终结果(数据框字典)。

以下是字典所需内容的示例:

{'employees':    id   name      date
 0   1    bob  1/1/2018
 1   2  sally  1/2/2018, 'positions':      pos      desc status
 0  12454  director      a
 1  65444   manager      i}

我想使用现有数据框的列表而不是 csv 文件。我尝试使用不带引号的列表,但出现错误:

l = [employees, positions]
d = {}
for x in l:
    d[x] = x

...但我收到此错误:

TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed

【问题讨论】:

  • 有什么不好的?
  • 如果df1df2 是全局命名空间中的变量,您可以使用globals()['df1'] 等方式访问它们。虽然更好的做法是在加载它们时将它们存储在字典中在。
  • l = ['df1','df2'] 是一个字符串列表。你需要一个数据框列表。
  • 我认为像d[x] = eval(x) 这样的解决方案会起作用,但我对eval 不太熟悉。
  • 如果我使用诸如 l = [df1, df2] 之类的数据帧列表,则会收到错误消息“数据帧对象是可变的,因此它们不能被散列”

标签: python pandas csv dictionary dataframe


【解决方案1】:

问题是您要定义一个字符串列表并构建一个字典,将每个字符串映射到自身。更简单的是将enumerate 与可迭代的数据帧一起使用。假设 df1df2 是数据帧:

d = dict(enumerate((df1, df2), 1))

然后通过d[1]d[2] 访问您的数据框。如果您真的希望您的键是字符串"df1""df2",您可以使用字典理解:

d = {'df'+str(i): j for i, j in enumerate((df1, df2), 1)}

在我看来,更好的命名约定是将文件名用作键:

files = ['employees', 'positions']
d = {f: pd.read_csv(f'P:\\python_work\\data_sets\\{f}.csv') for f in files}

【讨论】:

  • 我想使用类似于您使用文件名作为键的选项,但我想使用数据框名称作为键(即员工和职位是现有数据框而不是 csv 文件)。
  • @Dread,所以你问题中的例子不是很准确?以下是您应该做的事情:使用eval、使用globals、使用locals。您可以做的是将数据帧直接读入您的字典,例如d = {}; d['employees'] = pd.read_csv(...).
【解决方案2】:

你快到了,我添加了k 来说明在这种情况下你应该如何使用枚举

l = ['employees','positions']
k = [1,2]
d = {}
for index,x in enumerate(l):
    d[x] = k[index]

d 的返回值:

{'employees': 1, 'positions': 2}

超过你的数据框:

df_1 = d.get('employees')

(当然你必须用创建数据框来替换 k[index])

【讨论】:

    【解决方案3】:

    已经有一个字典,其中包含内存中所有声明的变量,可通过locals()globals() 内置函数使用,具体取决于数据帧是定义为局部变量还是全局变量。您应该能够像这样访问您的 DataFrame:

    locals()['df1']
    

    【讨论】:

    猜你喜欢
    • 2018-05-04
    • 2018-12-11
    • 2021-02-15
    • 1970-01-01
    • 2016-02-10
    • 2014-09-28
    • 2022-07-14
    • 2018-11-17
    • 2016-11-13
    相关资源
    最近更新 更多