熊猫将空的对象列添加到数据框[重复]

Posted

技术标签:

【中文标题】熊猫将空的对象列添加到数据框[重复]【英文标题】:Pandas adding empty column of objects to dataframe [duplicate] 【发布时间】:2018-12-14 14:27:02 【问题描述】:

How to add an empty column to a dataframe?

这已经部分覆盖了。

接受的答案中的dtype of df["D"] = np.nandtype=numpy.float64

有没有办法在每个单元格中初始化一个空列表?

试过df["D"] = [[]] * len(df),但所有值都指向同一个对象,将一个值设置为一个值会将它们全部设置。

df = pd.DataFrame("A": [1,2,3], "B": [2,3,4])
df

   A  B
0  1  2
1  2  3
2  3  4


df["D"] = [[]] * len(df)
df
   A  B   D
0  1  2  []
1  2  3  []
2  3  4  []


df['D'][1].append(['a','b','c','d'])
df
   A  B               D
0  1  2  [[a, b, c, d]]
1  2  3  [[a, b, c, d]]
2  3  4  [[a, b, c, d]]

想要

   A  B               D
0  1  2  []
1  2  3  [[a, b, c, d]]
2  3  4  []

【问题讨论】:

【参考方案1】:

使用

df["D"] = [[] for _ in range(len(df))]

而不是

df["D"] = [[]] * len(df) 

这样您将为每一行创建一个不同的[]


基本上[[] for _ in range(len(df))] 是list comprehension. 它为range(len(df)) 中的每个值创建一个[]

此代码与

具有相同的功能
l = []
for _ in range(len(df)):
    l.append([])

但明显更快更简单写起来,甚至更具可读性。

如果您想进一步了解列表推导,我推荐the answers for this question。

如果您想进一步了解为什么会在执行[[]] * len(df) 时发生这种行为,我建议您使用the answers for this question

【讨论】:

感谢这确实有效,您能否解释一下您做了什么以使我理解? @Joylove 当然 :) 我已经编辑了 下划线只是变量名。可能是ij 或任何其他名称。如果你不打算使用它,命名变量 _ 只是一个约定 哪一行会引发此警告? df["D"] = [[] for _ in range(len(df))] 不会发出此警告。【参考方案2】:

在创建列时,您不能只传递一个列表列表吗?然后将列表值分配给一个临时变量,接下来使用 loc 将该列表分配给数据框中的一个字段

import pandas as pd

df = pd.DataFrame()
df['col A'] = [1,12,312,352]
df['col B'] = [[],[],[],[]]

ser = [1,4,5,6]
df.loc[2,'col B'] = ser
df

输出:

这有帮助吗?这是你要找的吗?

【讨论】:

抱歉更新了一行,发现有错别字 当我遍历我的代码时,df 的行数会有所不同,因此在您的示例中 df['col B'] 无法使用固定长度的数据进行初始化。 然后使用@RafaelC 建议的代码在初始化列时效果最好。是吗? 太棒了。干杯

以上是关于熊猫将空的对象列添加到数据框[重复]的主要内容,如果未能解决你的问题,请参考以下文章

熊猫通过根据另一列的值添加列级别来重塑数据框[重复]

将分组的聚合唯一列添加到熊猫数据框

从字典中添加具有映射值的新熊猫列[重复]

通过用户定义的函数向数据框添加列

熊猫数据框使用列作为行[重复]

熊猫:将新列添加到作为索引列副本的数据框