我有一个熊猫数据框,其中的一列在每个单元格中都包含一个空列表。
我需要复制数据框,并将其附加在原始数据框的底部,但列表中还要包含其他信息。
这是一个最小的代码示例:
df_main = pd.DataFrame([['a', []], ['b', []]], columns=['letter', 'mylist'])
> df_main
letter mylist
0 a []
1 b []
df_copy = df_main.copy()
for index, row in df_copy.iterrows():
row.mylist = row.mylist.append(1)
pd.concat([ df_copy,df_main], ignore_index=True)
> result:
letter mylist
0 a None
1 b None
2 a [1]
3 b [1]
如您所见,存在一个问题,即[]空列表已被None
取代
只需确保,这就是我想要的:
letter mylist
0 a []
1 b []
2 a [1]
3 b [1]
我该如何实现?
答案 0 :(得分:1)
append
方法返回一个None
值,这就是None
出现在最终数据框中的原因。您可能已经使用+
运算符来进行这样的重新分配:
import pandas as pd
df_main = pd.DataFrame([['a', []], ['b', []]], columns=['letter', 'mylist'])
df_copy = df_main.copy()
for index, row in df_copy.iterrows():
row.mylist = row.mylist + list([1])
pd.concat([df_main, df_copy], ignore_index=True).head()
此代码块的输出:
letter mylist
0 a []
1 b []
2 a [1]
3 b [1]
答案 1 :(得分:0)
解决问题的一种方法是使用mylist2
创建一个临时列np.empty((len(df), 0)).tolist())
并使用np.where()
将None
的{{1}}值更改为一个空列表,然后删除空列。
mylist
答案 2 :(得分:0)
不仅如第一个答案所示,列表上的append方法还返回None值,而且df_main和df_copy都包含指向相同列表的指针。所以之后:
for index, row in df_copy.iterrows():
row.mylist.append(1)
两个数据帧均具有一个元素的更新列表。为了使代码按预期工作,您可以在复制数据框后创建一个新列表:
df_copy = df_main.copy()
for index, row in df_copy.iterrows():
row.mylist = []
这个问题是为什么我们不应该将对象放在数据框中的另一个很好的例子。