如何简化将具有某些值的列添加到数据框的操作?

时间:2019-05-15 16:51:42

标签: python pandas

我有一个大数据框(超过900000行),并希望根据第一列(带有日期和时间的时间戳)添加一些列。我的代码有效,但是我想它太复杂且太慢。我是一个初学者,所以将不胜感激!谢谢!

df['seconds_midnight'] = 0
df['weekday'] = 0
df['month'] = 0

def date_to_new_columns(date_var, i):
    sec_after_midnight = dt.timedelta(hours=date_var.hour, minutes=date_var.minute, seconds=date_var.second).total_seconds()
    weekday = dt.date.isoweekday(date_var)
    month1 = date_var.month
    df.iloc[i, 24] = sec_after_midnight
    df.iloc[i, 25] = weekday
    df.iloc[i, 26] = month1
    return


for i in range(0, 903308):
    date_to_new_columns(df.timestamp.iloc[i], i)

2 个答案:

答案 0 :(得分:0)

如果该列是datetime64 / Timestamp列,则可以使用.dt accessor

In [11]: df = pd.DataFrame(pd.date_range('2019-01-23', periods=3), columns=['date'])

In [12]: df
Out[12]:
        date
0 2019-01-23
1 2019-01-24
2 2019-01-25

In [13]: df.date - df.date.dt.normalize()  # timedelta since midnight
Out[13]:
0   0 days
1   0 days
2   0 days
Name: date, dtype: timedelta64[ns]

In [14]: (df.date - df.date.dt.normalize()).dt.seconds  # seconds since midnight
Out[14]:
0    0
1    0
2    0
Name: date, dtype: int64

In [15]: df.date.dt.day_name()
Out[15]:
0    Wednesday
1     Thursday
2       Friday
Name: date, dtype: object

In [16]: df.date.dt.month_name()
Out[16]:
0    January
1    January
2    January
Name: date, dtype: object

答案 1 :(得分:0)

所以这很慢的原因是for循环分别处理每一行。使熊猫如此好用的一件事是,您可以在一次操作中快速处理整个列/数据框。

因此,同时为每个新列创建所有行:

def date_to_new_columns(df):
    df['sec_after_midnight'] = (df.timestamp - df.timestamp.dt.normalize()).dt.seconds
    df['weekday'] = df.timestamp.dt.day_name
    df['month1'] = df.timestamp.dt.month
    return

请注意,在熊猫版本0.23.0之前,dt.day_name方法被称为dt.weekday_name。