我还是个新手,我正试着把列表理解(S.Molin的Pandas数据分析)转换成一个"普通"的for循环,只是为了练习.

最初,数据来自CSV文件,并使用Numpy加载.结果是将每个CSV行作为单个数组(VOID类型),如下所示:

array([('2018-10-13 11:10:23.560', '262km NW of Ozernovskiy, Russia', 'mww', 6.7, 'green', 1), ('2018-10-13 04:34:15.580', '25km E of Bitung, Indonesia', 'mww', 5.2, 'green', 0), ('2018-10-13 00:13:46.220', '42km WNW of Sola, Vanuatu', 'mww', 5.7, 'green', 0), ('2018-10-12 21:09:49.240', '13km E of Nueva Concepcion, Guatemala', 'mww', 5.7, 'green', 0), ('2018-10-12 02:52:03.620', '128km SE of Kimbe, Papua New Guinea', 'mww', 5.6, 'green', 1)], dtype=[('time', '<U23'), ('place', '<U37'), ('magType', '<U3'), ('mag', '<f8'), ('alert', '<U5'), ('tsunami', '<i4')])

我try 修改它,以便将每一列作为值的数组获得,其键是列的名称:

{'time': array(['2018-10-13 11:10:23.560', '2018-10-13 04:34:15.580','2018-10-13 00:13:46.220', '2018-10-12 21:09:49.240', '2018-10-12 02:52:03.620'], dtype='<U23'), 'place': array(['262km NW of Ozernovskiy, Russia', '25km E of Bitung, Indonesia', '42km WNW of Sola, Vanuatu','13km E of Nueva Concepcion, Guatemala','128km SE of Kimbe, Papua New Guinea'], dtype='<U37'), 'magType': array(['mww', 'mww', 'mww', 'mww', 'mww'], dtype='<U3'), 'mag': array([6.7, 5.2, 5.7, 5.7, 5.6]), 'alert': array(['green', 'green', 'green', 'green', 'green'], dtype='<U5'), 'tsunami': array([1, 0, 0, 0, 1])}

用于此目的的列表理解为:

array_dict = {col: np.array([row[i] for row in data]) for i, col in enumerate(data.dtype.names)}

到目前为止,我得到的解决方案是:

d ={}
for i,col in enumerate(data.dtype.names):
    for row in data:
        d[col].append(row[i])

我得到以下错误:

*---------
KeyError                                  Traceback (most recent call last)
Input In [51], in <cell line: 2>()
      2 for i,col in enumerate(data.dtype.names):
      3     for row in data:
----> 4         d[col].append(row[i])
KeyError: 'time'*

我在网上做了一些调查,这可能与数据类型列"Time"有关.我的猜测是,在列表理解中,每一列都被直接创建为NumPy数组,而在这里,我并没有事先将其设置为NumPy数组(因此数据类型的问题),但我确信我是错的.

任何帮助都将不胜感激.非常感谢!

推荐答案

要产生与您提供的词典理解相同的结果:

d = {}
for i, col in enumerate(data.dtype.names):
    values = []
    for row in data:
        values.append(row[i])
    d[col] = np.array(values)

您收到的错误是由于您的词典d为空(您创建的词典如下:d = {}).它不包含关键字‘time’.您可以像这样创建密钥:d['time'] = some_value,但如果它不存在,则不能直接访问它.

如果你愿意,你可以用collections.defaultdict美元.有了它,您就不必创建密钥了.如果访问不存在的键,将返回默认值.

使用您的原始代码,它将如下所示:

from collections import defaultdict

d = defaultdict(list)

for i, col in enumerate(data.dtype.names):
    for row in data:
        d[col].append(row[i])

dict(d)

然而,您的词典中的值不是np.ndaray,而是简单的列表.

Python相关问答推荐

过载功能是否包含Support Int而不是Support Int?

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

如何使用没有Selenium的Python在百思买着陆页面上处理国家/地区 Select ?

Python 3.12中的通用[T]类方法隐式类型检索

如何使用pandasDataFrames和scipy高度优化相关性计算

max_of_three使用First_select、second_select、

如何标记Spacy中不包含特定符号的单词?

在Python中管理打开对话框

如何使用它?

导入...从...混乱

为一个组的每个子组绘制,

多处理队列在与Forking http.server一起使用时随机跳过项目

启用/禁用shiny 的自动重新加载

如何排除prefecture_related中查询集为空的实例?

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

如何创建引用列表并分配值的Systemrame列

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

在二维NumPy数组中,如何 Select 内部数组的第一个和第二个元素?这可以通过索引来实现吗?

Python pint将1/华氏度转换为1/摄氏度°°

有了Gekko,可以创建子模型或将模型合并在一起吗?