在DataFrame中添加一个空列表的列

14 浏览
0 Comments

在DataFrame中添加一个空列表的列

与这个问题类似如何向数据框添加一个空列?,我想知道向DataFrame添加一个空列表列的最佳方法。

我要做的是初始化一个列,然后在迭代行时处理其中一些行,然后在这个新列中添加一个填充的列表以替换初始化的值。

例如,如果下面是我的初始DataFrame:

df = pd.DataFrame(d = {'a': [1,2,3], 'b': [5,6,7]}) # 示例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的项目序列,因此失败。

如果我尝试将一个列表分配给一个位置,将新列初始化为NoneNaN时,我会遇到以下问题。

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初始化的字段?

如果没有,那么初始化一个带有空列表的新列的最佳方法是什么?

0