我有以下代码用于使用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
答案 0 :(得分:1)
问题是您要定义一个字符串列表并构建一个将每个字符串映射到其自身的字典。更简单的方法是将enumerate
与可迭代的数据帧一起使用。假设df1
和df2
是数据帧:
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}
答案 1 :(得分:0)
您快到了,我加了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])
答案 2 :(得分:-1)
已经有一个字典,其中所有声明的变量都可以通过内置的locals()
或globals()
内置函数使用,具体取决于数据帧是定义为局部变量还是全局变量。您应该能够这样访问您的DataFrame:
locals()['df1']