【问题标题】: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.nan 是dtype=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  []

【问题讨论】:

    标签: pandas object dataframe


    【解决方案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 当然 :) 我已经编辑了
    • 下划线只是变量名。可能是i、j 或任何其他名称。如果你不打算使用它,命名变量 _ 只是一个约定
    • 哪一行会引发此警告? 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 建议的代码在初始化列时效果最好。是吗?
    • 太棒了。干杯
    猜你喜欢
    • 2018-10-14
    • 2017-08-21
    • 2023-02-15
    • 1970-01-01
    • 2018-10-26
    • 2016-09-08
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多