类似于此问题How to add an empty column to a dataframe?,我有兴趣了解向DataFrame添加一列空列表的最佳方法。
[我想做的基本上是初始化一列,当我遍历行以处理其中的一些,然后在此新列中添加填充列表以替换初始化的值。
例如,如果下面是我的初始DataFrame:
df = pd.DataFrame(d = {'a': [1,2,3], 'b': [5,6,7]}) # Sample DataFrame
>>> df
a b
0 1 5
1 2 6
2 3 7
然后,我想最终得到这样的结果,其中每一行都经过单独处理(显示示例结果):
>>> df
a b c
0 1 5 [5, 6]
1 2 6 [9, 0]
2 3 7 [1, 2, 3]
当然,如果我尝试像df['e'] = []
一样使用任何其他常量进行初始化,它会认为我正在尝试添加长度为0的项目序列,因此失败。
如果尝试将新列初始化为None
或NaN
,则尝试将列表分配给位置时遇到以下问题。
df['d'] = None
>>> df
a b d
0 1 5 None
1 2 6 None
2 3 7 None
问题1(如果我可以采用这种方法,那将是完美的!也许我缺少一些琐碎的东西:]]
>>> df.loc[0,'d'] = [1,3] ... ValueError: Must have equal len keys and value when setting with an iterable
问题2(此方法有效,但并非没有警告,因为不能保证它可以按预期工作):
>>> df['d'][0] = [1,3] C:\Python27\Scripts\ipython:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
因此,我诉诸于初始化空列表并根据需要扩展它们。我可以想到几种方法来进行这种初始化,但是还有更简单的方法吗?
方法1:
df['empty_lists1'] = [list() for x in range(len(df.index))] >>> df a b empty_lists1 0 1 5 [] 1 2 6 [] 2 3 7 []
方法2:
df['empty_lists2'] = df.apply(lambda x: [], axis=1) >>> df a b empty_lists1 empty_lists2 0 1 5 [] [] 1 2 6 [] [] 2 3 7 [] []
问题摘要:
在问题1中是否有任何较小的语法更改可以解决,可以将列表分配给None
/ NaN
初始化字段?
如果没有,那么用空列表初始化新列的最佳方法是什么?
类似于此问题,如何向数据框添加空列?,我有兴趣了解向数据框添加空列表列的最佳方法。我想做的基本上是...
另一种方法是使用np.empty
:
我为接受的答案中的所有三种方法计时,最快的一种花费了我的机器216毫秒。但是,这只花了28毫秒:
df['e5'] = [set()] * len(df)
和map