【发布时间】:2015-10-06 15:22:10
【问题描述】:
类似于这个问题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
因此,我使用空列表进行初始化并根据需要扩展它们。我可以想到几种方法来初始化这种方式,但有没有更直接的方法?
方法一:
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 []
方法二:
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 初始化字段?
如果不是,那么用空列表初始化新列的最佳方法是什么?
【问题讨论】:
-
在第 1 期和第 2 期中,您开始引用 d 列。那是什么意思?
-
以及它的价值我喜欢方法 2。非常简单的 imo。
-
Column
'd'只是None或NaN初始化值的列,正如问题之前定义的那样。 -
是否有任何可以在问题 1 中解决的细微语法更改,允许将列表分配给
None/NaN初始化字段?