Pandas向DataFrame添加空对象列

4

如何在dataframe中添加一个空列?

这已经有部分涵盖了。

接受的答案中,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]]

wanted

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

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

代替

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

这样,您将为每一行创建一个不同的[]
基本上,[[] for _ in range(len(df))] 是一个列表推导式。它为range(len(df))中的每个值创建一个[]
这段代码的功能与以下代码相同:
l = []
for _ in range(len(df)):
    l.append([])

但是明显更快,更简单易读。

如果您想进一步了解列表推导式,请参考此问题的答案

如果您想深入了解在执行[[]] * len(df)时为什么会出现该行为,我建议您参考此问题的答案


1
谢谢,这个方法确实有效。您能否解释一下您做了什么,以便我理解呢? - Joylove
1
@Joylove 当然可以 :) 我已经编辑过了。 - rafaelc
2
下划线只是一个变量的名称。它本可以是ij或任何其他名称。如果您不打算使用它,将变量命名为_只是一种惯例。 - rafaelc
1
哪一行引发了这个警告?df["D"] = [[] for _ in range(len(df))] 不会引发此警告。 - rafaelc

1

在创建列时,您是否可以直接传入一个列表的列表。然后将列表值分配给临时变量,接下来使用 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

输出:

Click Here to View Image

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


抱歉,我更新了一行代码,发现了一个拼写错误。 - Kavi Sek
在我的代码循环中,df的行数是变化的,因此在您的示例中,无法使用固定长度的数据初始化df ['col B']。 - Joylove
1
那么使用@RafaelC建议的代码,在列初始化时会最好地工作。是吗? - Kavi Sek
1
很棒。干杯。 - Kavi Sek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接