Pandas 添加带有日期的列
Pandas adding column with date
我想添加一个日期差异列,它需要一些日期并减去 df 中的日期列。棘手的部分是,如果 Id 没有出现两次,它只会计算名称列中是否有字符串 X。例如,
df
Id Date Name
111 1/1/17 Xyz
123 1/2/17 Xab
222 1/1/17 abc
222 1/2/17 Xab
333 1/1/17 abc
333 1/2/17 def
如果我使用 currentdate = datetime.date(2017,5, 1),结果将是:
Id Date Name Diff
111 1/1/17 Xyz 4
123 1/2/17 Xab 3
222 1/1/17 abc 0
222 1/2/17 Xab 0 (this is 0 since 222 already showed up)
333 1/1/17 abc 0
333 1/2/17 def 0
我的方法是按字符串 'X' 对它们进行分组,但我不确定如何获取唯一行。
提前致谢!
首先,创建一个时间戳对象 -
d = pd.to_datetime('2017-01-5')
选项 1
现在,计算差异,并根据您的条件使用 mask
隐藏行 -
m = df['Id'].duplicated(keep=False) | ~df['Name'].str.contains('X')
df['Diff'] = (d - pd.to_datetime(df['Date'])).dt.days.mask(m, 0)
df
Id Date Name Diff
0 111 1/1/17 Xyz 4
1 123 1/2/17 Xab 3
2 222 1/1/17 abc 0
3 222 1/2/17 Xab 0
4 333 1/1/17 abc 0
5 333 1/2/17 def 0
我使用 pd.Series.duplicated
删除那些重复的条目,并使用 str.contains
检查 X
是否在 Name
.
中
选项 2
您可以使用 np.where
,但方法相似 -
m = df['Id'].duplicated(keep=False) | ~df['Name'].str.contains('X')
df['Diff'] = np.where(m, 0, (d - pd.to_datetime(df['Date'])).dt.days)
df
Id Date Name Diff
0 111 1/1/17 Xyz 4
1 123 1/2/17 Xab 3
2 222 1/1/17 abc 0
3 222 1/2/17 Xab 0
4 333 1/1/17 abc 0
5 333 1/2/17 def 0
我想添加一个日期差异列,它需要一些日期并减去 df 中的日期列。棘手的部分是,如果 Id 没有出现两次,它只会计算名称列中是否有字符串 X。例如,
df
Id Date Name
111 1/1/17 Xyz
123 1/2/17 Xab
222 1/1/17 abc
222 1/2/17 Xab
333 1/1/17 abc
333 1/2/17 def
如果我使用 currentdate = datetime.date(2017,5, 1),结果将是:
Id Date Name Diff
111 1/1/17 Xyz 4
123 1/2/17 Xab 3
222 1/1/17 abc 0
222 1/2/17 Xab 0 (this is 0 since 222 already showed up)
333 1/1/17 abc 0
333 1/2/17 def 0
我的方法是按字符串 'X' 对它们进行分组,但我不确定如何获取唯一行。 提前致谢!
首先,创建一个时间戳对象 -
d = pd.to_datetime('2017-01-5')
选项 1
现在,计算差异,并根据您的条件使用 mask
隐藏行 -
m = df['Id'].duplicated(keep=False) | ~df['Name'].str.contains('X')
df['Diff'] = (d - pd.to_datetime(df['Date'])).dt.days.mask(m, 0)
df
Id Date Name Diff
0 111 1/1/17 Xyz 4
1 123 1/2/17 Xab 3
2 222 1/1/17 abc 0
3 222 1/2/17 Xab 0
4 333 1/1/17 abc 0
5 333 1/2/17 def 0
我使用 pd.Series.duplicated
删除那些重复的条目,并使用 str.contains
检查 X
是否在 Name
.
选项 2
您可以使用 np.where
,但方法相似 -
m = df['Id'].duplicated(keep=False) | ~df['Name'].str.contains('X')
df['Diff'] = np.where(m, 0, (d - pd.to_datetime(df['Date'])).dt.days)
df
Id Date Name Diff
0 111 1/1/17 Xyz 4
1 123 1/2/17 Xab 3
2 222 1/1/17 abc 0
3 222 1/2/17 Xab 0
4 333 1/1/17 abc 0
5 333 1/2/17 def 0