Pythonic循环字典的方法
Posted
技术标签:
【中文标题】Pythonic循环字典的方法【英文标题】:Pythonic way to loop over dictionary 【发布时间】:2018-04-28 06:12:33 【问题描述】:我正在练习 Pandas,有以下任务:
创建一个列表,其元素是每个 .csv 文件的列数
.csv 文件存储在字典 directory
按年份键入
我使用字典理解 dataframes
(再次按年份键入)将 .csv 文件存储为 pandas 数据帧
directory = 2009: 'path_to_file/data_2009.csv', ... , 2018: 'path_to_file/data_2018.csv'
dataframes = year: pandas.read_csv(file) for year, file in directory.items()
# My Approach 1
columns = [df.shape[1] for year, df in dataframes.items()]
# My Approach 2
columns = [dataframes[year].shape[1] for year in dataframes]
哪种方式更“Pythonic”?还是有更好的方法来解决这个问题?
【问题讨论】:
你能用[df.shape[1] for df in dataframes.values()]
吗?
@PeterGibson 这正是我想要的!不知道有dict.values()
方法
【参考方案1】:
import os
#use this to find files under certain dir, you can filter it if there are other files
target_files = os.listdir('path_to_file/')
columns = list()
for filename in train_files:
#in your scenario @piRSquared's answer would be more efficient.
columns.append(#column_numbers)
如果您希望文件名中的键按年份列出,您可以像这样过滤文件名并更新字典:
year = filename.replace(r'[^0-9]', '')
【讨论】:
【参考方案2】:您的方法 2:
columns = [dataframes[year].shape[1] for year in dataframes]
在未来使用数据框进行合并、绘图、操作等时更加 Pythonic 和简洁。因为在理解中隐含了键,而形状给出了列数
【讨论】:
【参考方案3】:你可以使用:
columns = [len(dataframe.columns) for dataframe in dataframes.values()]
正如@piRSquared 提到的,如果您的唯一目标是获取数据框中的列数,则不应读取整个 csv 文件,而应使用 read_csv 函数的 nrows 关键字参数。
【讨论】:
【参考方案4】:您的方法将完成...但我不喜欢读取整个文件并创建一个数据框只是为了计算列数。你可以通过读取每个文件的第一行并计算逗号的数量来做同样的事情。请注意,我添加了1
,因为逗号总是比列数少一个。
columns = [open(f).readline().count(',') + 1 for _, f in directory.items()]
【讨论】:
很酷的解决方案!不过,这项任务只是一个更大项目的一部分,我将在其中操作、合并、绘制各种数据框等。 @VivekJha 那么您的解决方案没有任何问题。不过,我会警告你,如果你正在使用数据框字典在下游做其他事情......我会小心的。如果您在这方面遇到麻烦并且无法通过搜索找到解决方案,请不要犹豫,再问一个问题。 此外,提供的其他答案与您自己提出的答案一样“Pythonic”。以上是关于Pythonic循环字典的方法的主要内容,如果未能解决你的问题,请参考以下文章
在没有 NoneType 错误的情况下访问嵌套字典的 pythonic 方法是啥
将字典转换为 namedtuple 或其他类似哈希的字典的 Pythonic 方法?