将空列表列添加到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
:df['empty_list'] = np.empty((len(df), 0)).tolist()
.index
尝试查找时len
,您也可以关闭“方法1”df
。df['empty_list'] = [[] for _ in range(len(df))]
事实证明,
np.empty
速度更快…In [1]: import pandas as pd In [2]: df = pd.DataFrame(pd.np.random.rand(1000000, 5)) In [3]: timeit df['empty1'] = pd.np.empty((len(df), 0)).tolist() 10 loops, best of 3: 127 ms per loop In [4]: timeit df['empty2'] = [[] for _ in range(len(df))] 10 loops, best of 3: 193 ms per loop In [5]: timeit df['empty3'] = df.apply(lambda x: [], axis=1) 1 loops, best of 3: 5.89 s per loop