如何将列表的元素动态分配给满足 pandas 中特定条件的单元格?
How can I dynamically assign elements of a list to cells meeting specific condition in pandas?
我正在做动物研究并使用输出大量 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,并且在循环到达 'list index out of range' 时立即收到错误n=15 个文件。由于我的工作性质,未来 n 数字很可能会更改多次,因此我想调整我的代码以适应这种情况。我的主要问题是我不熟悉 Python 的基本原则,原因是我需要快速进步,从不知道如何用任何语言编写代码到开发自己的脚本古怪的 CSV,我决定我将专注于理解 pandas 并且只学习与解决我眼前的问题直接相关的部分,不幸的是,这是以没有能力解决这样的问题为代价的......
我已经尝试了不同的方法 none,其中一些有效,所以我的问题是如何使它动态化,以便它适用于各种 n 数字?
非常非常感谢!
您应该只创建一个从会话编号到 ID 的映射。
假设您的会话总是从 1 开始编号,这将有效:
SESSION_ID = dict(enumerate(ID, 1))
然后简单地:
df['ID'] = df['Session'].map(SESSION_ID)
我正在做动物研究并使用输出大量 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,并且在循环到达 'list index out of range' 时立即收到错误n=15 个文件。由于我的工作性质,未来 n 数字很可能会更改多次,因此我想调整我的代码以适应这种情况。我的主要问题是我不熟悉 Python 的基本原则,原因是我需要快速进步,从不知道如何用任何语言编写代码到开发自己的脚本古怪的 CSV,我决定我将专注于理解 pandas 并且只学习与解决我眼前的问题直接相关的部分,不幸的是,这是以没有能力解决这样的问题为代价的......
我已经尝试了不同的方法 none,其中一些有效,所以我的问题是如何使它动态化,以便它适用于各种 n 数字?
非常非常感谢!
您应该只创建一个从会话编号到 ID 的映射。
假设您的会话总是从 1 开始编号,这将有效:
SESSION_ID = dict(enumerate(ID, 1))
然后简单地:
df['ID'] = df['Session'].map(SESSION_ID)