在数据框中添加来自列表的列。
在数据框中添加来自列表的列。
我有一个包含以下列的数据框:
A B C 0 4 5 6 7 7 6 5
A列的可能取值范围只能是0到7。
此外,我有一个包含8个元素的列表,如下所示:
List=[2,5,6,8,12,16,26,32] //这个列表只有8个元素
如果A列中的元素是n,我需要在一个新的列中插入List中的第n个元素,假设为'D'列。
我如何一次性完成这个操作,而不需要循环遍历整个数据框?
最终的数据框将如下所示:
A B C D 0 2 4 12 5 16 6 26 7 32 7 32 6 26 5 16
注意:数据框非常庞大,迭代是最后的选择。但是如果需要,我也可以将'List'中的元素排列在任何其他数据结构中,比如字典。
问题出现的原因是想要将一个列表中的值添加到数据帧中作为一个新的列。解决方法是将列表转换成Series,并使用insert函数将该列添加到数据帧中的指定位置。
首先,将列表转换成Series:
column_values = pd.Series(mylist)
然后使用insert函数添加列。这个函数的优点是可以选择将列放置在哪个位置。
在下面的示例中,我们将新的列放置在最左边的位置(通过设置loc=0):
df.insert(loc=0, column='new_column', value=column_values)
如果你将数据帧的索引更改为不是1,2,3...的其他值,则以上方法将不起作用。在这种情况下,你需要在这两行代码之间添加:column_values.index=df.index
问题的原因是想要从一个列表中添加一个新的列到数据框中。解决方法是将列表转换为numpy的ndarray,然后使用索引将其添加到数据框中。
在这个例子中,作者创建了一个新的数组m,并使用df.A的值作为索引来选择相应的元素,并将选择的元素赋值给df的新列D。如果使用np.asarray(List)将列表转换为ndarray,同样的方法也可以工作。
作者注意到,如果使用旧版本的numpy,可能需要使用m[df.A.values]来代替。因为在过去,numpy与其他库不兼容,导致一些问题。但是现在情况已经改善了。
然后,一位读者提到他在使用作者的方法时遇到了一个错误。作者指出这是一个旧版本numpy的bug,并建议读者尝试使用d["D"] = m[d.A.values]来解决问题。
问题的原因是想要将一个列表添加为DataFrame的新列,但是在操作中出现了警告信息。解决方法有两种:一种是直接将列表赋值给新列,另一种是将列表转换为Series或数组,然后再赋值给新列。
第一种解决方法是直接赋值:df['new_col'] = mylist
。这种方法简单直接,可以直接将列表赋值给新的列。
第二种解决方法是将列表转换为Series或数组,然后再赋值给新列。转换为Series的方法是使用pd.Series(mylist)
,然后通过se.values
将Series的值赋给新列。另外一种转换为数组的方法是使用np.array(mylist)
,然后将数组赋值给新列。
在使用pd.Series
转换时可能会出现警告信息:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
。这是一个误报警告,可以在这种情况下忽略。更多信息可以参考stackoverflow.com/questions/20625582/…。简化的方式是直接将Series的值赋给新列:df['new_col'] = pd.Series(mylist).values
。
通过以上两种方法,可以将一个列表添加为DataFrame的新列。