【发布时间】:2021-06-24 13:17:21
【问题描述】:
我一直在使用以下方法根据满足多个列表中的多个条件的每一行为新列分配值。它适用于小型 dfs...但是一旦我处理更大的数据,就需要很长时间。
for i, j, k in zip(list1, list2, list3):
df.loc[((df['foo'] == i) & (df['bar'] == j)),'new_column'] = k
示例数据:
list1 = ['a', 'a', 'e', 'f', 'c']
list2 = [3, 4, 5, 3, 2]
list3 = ['yellow', 'green', 'blue', 'purple', 'orange', 'black']
df = pd.dataframe({'foo': ['a', 'b', 'c', 'd', 'e', 'f', 'c'],
'bar': [3, 2, 2, 4, 5, 3, 2]})
所以基本上对于新专栏,我需要:
- 第一行标记为黄色(因为 list1=a & list2=3)
- 第三行标记为黑色(因为 list1=c & list2=2)
- 第 5 行标记为蓝色(因为 list1=e & list2=5)
- 第 6 行标记为橙色(因为 list1=f & list2=3)
- 第 7 行标记为黑色(因为 list1=c & list2=2)
所有列表的长度相同。我已经在 Stack 中搜索了更好的选项,因此我知道一个选项是列表理解(或其他选项),但不确定如何将其与 .loc 结合并创建一个新列。
提前感谢您的帮助!
【问题讨论】:
-
list*变量的大小如何? -
所有列表的长度相同(它们只是来自不同 df 的 3 列)。 :)
-
是的,我的意思是
list1的长度是多少?我正在尝试查看您需要运行多少循环以及您将拥有多少组合。 -
也许你可以展示示例数据框,然后说明你做了什么以及你想要什么得到准确的答案,也许你根本不需要 for 循环,因为它可以使用 pandas internal 完成功能。
-
代码不正确。请正确申报清单。对于字符串,请使用
"引号
标签: python pandas loops list-comprehension