首页 > 解决方案 > 如何将列表的元素动态分配给满足熊猫特定条件的单元格?

问题描述

我正在做动物研究并使用输出大量 csv 文件的自动操作框,我有多个动物每天运行多个会话,因此为了理解我的数据,我遍历多个 csv 文件并将相关数据提取到单独的excel文件。我设法使几乎所有代码都动态化,除了一个关键位:我必须将主题 ID 分配给对应于该主题数据的多个行范围。

我目前这样做的方式是首先按照当天运行的顺序提取 16 个主题的 [ID] 列表,然后在我的数据框中创建一个新的会话顺序列,以告知数据是哪个会话为了。然后我创建了一个空白的“ID”列,然后手动将每个行范围从会话 1 分配到 [ID] 列表中的第一个元素,然后将会话 2 分配到第二个元素,依此类推,这里是代码例子:

df['ID'] = 0
df.at[(df['Session'] == 1), 'ID'] = ID[0]
df.at[(df['Session'] == 2), 'ID'] = ID[1]
df.at[(df['Session'] == 3), 'ID'] = ID[2]
df.at[(df['Session'] == 4), 'ID'] = ID[3]
df.at[(df['Session'] == 5), 'ID'] = ID[4]
df.at[(df['Session'] == 6), 'ID'] = ID[5]
df.at[(df['Session'] == 7), 'ID'] = ID[6]
df.at[(df['Session'] == 8), 'ID'] = ID[7]
df.at[(df['Session'] == 9), 'ID'] = ID[8]
df.at[(df['Session'] == 10), 'ID'] = ID[9]
df.at[(df['Session'] == 11), 'ID'] = ID[10]
df.at[(df['Session'] == 12), 'ID'] = ID[11]
df.at[(df['Session'] == 13), 'ID'] = ID[12]
df.at[(df['Session'] == 14), 'ID'] = ID[13]
df.at[(df['Session'] == 15), 'ID'] = ID[14]
df.at[(df['Session'] == 16), 'ID'] = ID[15]

到目前为止,这对我很有帮助,但是我的 n 数已更改为 15,现在我混合了具有不同 n 数的 CSV,并且一旦循环到达 n = 15,我就会收到“列表索引超出范围”错误文件。由于我的工作性质,n 数字很可能会在未来多次更改,因此我想调整我的代码以适应这种情况。我的主要问题是我不熟悉 Python 的基本原理,原因是我需要快速进步,从不知道如何用任何语言编写代码到开发自己的脚本,为古怪的 CSV 量身定做,我决定'

我尝试了不同的方法,但都没有奏效,所以我的问题是如何使这个动态化,以便它适用于各种 n 数字?

很多很多提前谢谢!

标签: pythonpandasloopsdata-science

解决方案


您应该只创建一个从会话号到 ID 的映射。

假设您的会话将始终从 1 开始编号,这将起作用:

SESSION_ID = dict(enumerate(ID, 1))

然后简单地说:

df['ID'] = df['Session'].map(SESSION_ID)

推荐阅读