使用默认值将列添加到dataframe

dar*_*ool 151 python pandas

我有一个现有的数据框,我需要添加一个额外的列,每列包含相同的值.

现有的df:

Date, Open, High, Low, Close
01-01-2015, 565, 600, 400, 450
Run Code Online (Sandbox Code Playgroud)

新df:

Name, Date, Open, High, Low, Close
abc, 01-01-2015, 565, 600, 400, 450
Run Code Online (Sandbox Code Playgroud)

我知道如何附加现有的系列/数据框列.但这是一种不同的情况,因为我需要的是添加"名称"列并将每一行设置为相同的值,在本例中为"abc".

我不完全确定如何做到这一点.

EdC*_*ica 233

df['Name']='abc' 将添加新列并将所有行设置为该值:

In [79]:

df
Out[79]:
         Date, Open, High,  Low,  Close
0  01-01-2015,  565,  600,  400,    450
In [80]:

df['Name'] = 'abc'
df
Out[80]:
         Date, Open, High,  Low,  Close Name
0  01-01-2015,  565,  600,  400,    450  abc
Run Code Online (Sandbox Code Playgroud)

  • 有没有其他方法可以做到这一点?我收到了警告.尝试在DataFrame的切片副本上设置值.尝试使用.loc [row_indexer,col_indexer] = value.请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy (23认同)
  • 这意味着您要分配的内容是副本而不是原始df,如果不以问题的形式查看数据和代码,我无法进一步评论.在评论中回答问题是适得其反的.此代码有效,您在此之前已经做了一些事情来提出警告 (2认同)
  • 当我想插入每个常量值等于某个列表的新列时该怎么办?例如,我想插入“Trajectory”列,每行值等于“[0,0,0]”?它不能按您的方式工作“df['Trajectory'] = [0,0,0]”,因为 pandas 将“list”理解为整个列。 (2认同)

piR*_*red 51

您可以使用它insert来指定新列的位置.在这种情况下,我用0左侧放置新列.

df.insert(0, 'Name', 'abc')

  Name        Date  Open  High  Low  Close
0  abc  01-01-2015   565   600  400    450
Run Code Online (Sandbox Code Playgroud)


Zer*_*ero 36

单衬里工作

df['Name'] = 'abc'
Run Code Online (Sandbox Code Playgroud)

创建一个Name列并将所有行设置为abcvalue

  • 这给了我一个警告:A value is试图在 DataFrame 的切片副本上设置。 (2认同)

mat*_*son 33

我想引起更多关注@michele-piccolini 答案的一部分。

我坚信这.assign是最好的解决方案。在现实世界中,这些操作并不是孤立的,而是一系列操作。如果您想支持一系列操作,您可能应该使用该.assign方法。

这是一个使用滑雪胜地降雪数据的示例(但相同的原则也适用于……财务数据)。

这段代码读起来就像一个步骤食谱。两个赋值(与=) 并使.insert这变得更加困难:

raw = pd.read_csv('https://github.com/mattharrison/datasets/raw/master/data/alta-noaa-1980-2019.csv',
                  parse_dates=['DATE'])
def clean_alta(df):
    return (df
            .loc[:, ['STATION', 'NAME', 'LATITUDE', 'LONGITUDE', 'ELEVATION', 'DATE', 
                     'PRCP', 'SNOW', 'SNWD', 'TMAX', 'TMIN', 'TOBS']]
            .groupby(pd.Grouper(key='DATE', freq='W'))
            .agg({'PRCP': 'sum', 'TMAX': 'max', 'TMIN': 'min', 'SNOW': 'sum', 'SNWD': 'mean'})
            .assign(LOCATION='Alta', 
                    T_RANGE=lambda w_df: w_df.TMAX-w_df.TMIN)
    )

clean_alta(raw)
Run Code Online (Sandbox Code Playgroud)

请注意.assign(LOCATION='Alta', 在其余操作中间创建具有单个值的列的行。


Mic*_*ini 26

总结其他人的建议,并增加第三种方式

您可以:

所有这些方法都允许您从系列中添加新列(只需用上面的'abc'默认参数替换系列).


小智 16

One Line 帮我完成了这项工作。

df['New Column'] = 'Constant Value'
df['New Column'] = 123
Run Code Online (Sandbox Code Playgroud)


小智 11

您可以简单地执行以下操作:

df['New Col'] = pd.Series(["abc" for x in range(len(df.index))])
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这对于避免该死的链式索引警告特别好。 (2认同)
  • 谢谢,这非常适合将数据帧分配给列,又名 `df['date'] = pd.Series([pd.date_range('2020-01-01', '2023-12-31') for x在范围内(len(df.index))])` (2认同)

小智 7

这条线就可以工作。

df['名称'] = 'abc'