创建两行不同的列

2024-09-29 04:23:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据帧,一列中有散列,另一列中有日期。我想创建一个带有age的新列,即带有特定散列的第一个日期和当前日期之间的差值。例如,dataframeinf包含

inf.head(5)
                                   id       date
0  00047331-29e7-4165-833f-3efcfc2ea90f 2015-08-19
1  0005b350-31ac-443c-8244-21a34120c83d 2015-08-20
2  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-10
3  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-07
4  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-04

我添加了一个名为age的列

inf['age'] = pd.Series(np.zeros(len(inf)), index=inf.index)

现在我想把这个转换成

                               id       date  age
0  00047331-29e7-4165-833f-3efcfc2ea90f 2015-08-19    0
1  0005b350-31ac-443c-8244-21a34120c83d 2015-08-20    0
2  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-10    0
3  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-07    -3
4  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-04    -6

其中,最后一列是特定id的第一个日期与该行中的日期之间的差。我目前正在使用它来执行以下操作:

datedict={}
for count in range(len(inf)):
    try:
        inf['age'][count]=inf['date'][count]-datedict[inf['id'][count]]
    except KeyError:
        datedict[inf['udid'][count]]=inf['date'][count]

这是工作,但令人厌恶的缓慢。花了一个多小时录了10万张唱片。有没有更好的方法?你知道吗


Tags: 数据idagedateindexlencounthead
2条回答

Anton's类似,味道略有不同:

df['date'] = pd.to_datetime(df['date'])

def Age(df):
    df.reset_index(drop=True, inplace=True)
    df['age'] = [x-df.date[0] for x in df.date]
    return df

df = df.groupby('id').apply(Age)

可以对哈希使用groupby方法,然后对date列和iloc使用transform方法来获取第一个元素。您还需要使用pd.to_datetime将日期列转换为日期时间:

In [402]: df
Out[402]: 
                                     id       date
0  00047331-29e7-4165-833f-3efcfc2ea90f 2015-08-19
1  0005b350-31ac-443c-8244-21a34120c83d 2015-08-20
2  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-10
3  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-07
4  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-04

dates = df.groupby('id')['date'].transform(lambda x:  (x - x.iloc[0])) 

In [405]: dates
Out[405]: 
0   1970-01-01
1   1970-01-01
2   1970-01-01
3   1969-12-29
4   1969-12-26
Name: date, dtype: datetime64[ns]

我不知道为什么它从1970年1月1日开始印刷,但你可以通过从中减去pd.Timestamp('1970-01-01')来解决这个问题

In [408]: dates - pd.Timestamp('1970-01-01')
Out[408]: 
0    0 days
1    0 days
2    0 days
3   -3 days
4   -6 days
Name: date, dtype: timedelta64[ns]

如果只需要值,可以使用dt.days,然后将其传递到新列age

df['age'] = (dates - pd.Timestamp('1970-01-01')).dt.days

In [415]: df
Out[415]: 
                                     id       date  age
0  00047331-29e7-4165-833f-3efcfc2ea90f 2015-08-19    0
1  0005b350-31ac-443c-8244-21a34120c83d 2015-08-20    0
2  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-10    0
3  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-07   -3
4  0007da63-6fa6-4c0d-a1b1-b09fb0353853 2015-08-04   -6

相关问题 更多 >