【问题标题】:Add constant list to pandas column将常量列表添加到 pandas 列
【发布时间】:2020-11-26 04:13:21
【问题描述】:

假设我有一个 df:

df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})

我只想添加一个带有常量列表的新列c(例如:[7,8,9,10])。

当我尝试时:

df['c']=[7,8,9,10]

我明白了:

ValueError: Length of values does not match length of index

我也尝试与locatix 一起玩 - 但无法弄清楚。

我发现一个丑陋的解决方法是:

df['c'] = df['b'].apply(lambda x: [7,8,9,10])

但必须有更优雅的方式来做到这一点。

【问题讨论】:

  • 这很困难是有原因的。为什么需要在 DataFrame 的每一行中存储一个列表,更不用说具有相同确切信息的列表?

标签: python pandas list


【解决方案1】:

更简单的方法是:

df['c'] =  [[7,8,9,10]]*len(df)

结果:

   a  b              c
0  1  4  [7, 8, 9, 10]
1  2  5  [7, 8, 9, 10]
2  3  6  [7, 8, 9, 10]

更新:

为避免每行中列表的浅拷贝问题(如@YOBEN_S 所述),请使用:

df['c'] = df.apply(lambda x: [7,8,9,10], axis = 1)

现在可以通过调用仅更改第一行的c 列中的第一个元素:

df.loc[0,'c'][0]='test'
   a  b                 c
0  1  4  [test, 8, 9, 10]
1  2  5     [7, 8, 9, 10]
2  3  6     [7, 8, 9, 10]

【讨论】:

  • 这是不安全的。
  • 在这种情况下不安全意味着什么?顺便说一句,我试图找到替代解决方案但失败了。 @YOBEN_S 你有更合适的答案吗?
  • 试试 df.loc[0,'c'][0]='test',你会改变所有行~
  • 是的,好像有浅拷贝的问题。为避免它可以使用df['c'] = df.apply(lambda x: [7,8,9,10], axis = 1)。但是有比lambda更好的方法吗?
  • 我会做for循环
【解决方案2】:

这会将常量列表添加到 df

#df['c']=pd.Series([[7,8,9,10]]*len(df))
df=df.assign(c=pd.Series([[7,8,9,10]]*len(df)))



  a  b              c
0  1  4  [7, 8, 9, 10]
1  2  5  [7, 8, 9, 10]
2  3  6  [7, 8, 9, 10]

这将使用其索引将列添加到 df

df['c']=pd.Series([7,8,9,10])
   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 2016-11-16
    • 2020-12-28
    • 2022-07-22
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2015-04-25
    相关资源
    最近更新 更多