ChatGPT解决这个技术问题 Extra ChatGPT

将列添加到具有恒定值的数据框

我有一个现有的数据框,我需要添加一个附加列,其中每一行都包含相同的值。

现有的df:

Date, Open, High, Low, Close
01-01-2015, 565, 600, 400, 450

新的df:

Name, Date, Open, High, Low, Close
abc, 01-01-2015, 565, 600, 400, 450

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


E
EdChum

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

当我想插入每个常量值等于某个列表的新列时怎么办?例如,我想插入每行值等于 [0,0,0]Trajectory 列?它不适合您的方式 df['Trajectory'] = [0,0,0],因为 pandas 将 list 理解为整个列。
p
piRSquared

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

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

  Name        Date  Open  High  Low  Close
0  abc  01-01-2015   565   600  400    450

J
Jolta

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

你可以:

分配(**kwargs):df.assign(名称='abc')

访问新的列系列(它将被创建)并设置它: df['Name'] = 'abc'

插入(位置,列,值,allow_duplicates=False)df.insert(0,'名称','abc')

其中参数 loc ( 0 <= loc <= len(columns) ) 允许您在所需的位置插入列。

'loc' 为您提供插入后列所在的索引。例如,上面的代码将列 Name 插入为第 0 列,即它将插入到第一列之前,成为新的第一列。 (索引从 0 开始)。

所有这些方法都允许您从系列中添加新列(只需将上面的“abc”默认参数替换为系列)。


Z
Zero

单班轮作品

df['Name'] = 'abc'

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


M
Matt Harrison

我想更多地关注@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)

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


Z
Zachary

一条线为我完成了这项工作。

df['New Column'] = 'Constant Value'
df['New Column'] = 123

对我来说,这增加了一个新行,而不是一列。
I
Imam_AI

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

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

谢谢,这对于避免该死的链式索引警告特别好。
谢谢,这非常适合将数据框分配给列,即 df['date'] = pd.Series([pd.date_range('2020-01-01', '2023-12-31') for x in range(len(df.index))])