类似于这个问题 如何向数据框添加一个空列?,我想知道最好的方法是如何向 DataFrame 添加一个空列表的列。
我想要做的事情基本上就是初始化一个列,并在迭代行以处理其中一些行时,在这个新列中添加一个填充列表以替换初始化值。
例如,如果以下是我的初始 DataFrame:
如果我尝试将新列初始化为
方法1:
我想要做的事情基本上就是初始化一个列,并在迭代行以处理其中一些行时,在这个新列中添加一个填充列表以替换初始化值。
例如,如果以下是我的初始 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
初始化的字段?
如果没有,那么最好的初始化新列的方法是什么?
None
或NaN
初始化值组成的列,正如问题之前所定义的。 - vk1011None
/NaN
初始化的字段? - vk1011df.at[0,'d'] = [1,3]
将一个(空)列表分配给单元格。 - Frank_Coumans