我想在 pandas 数据帧中的行中设置一个值,其中行索引具有重复值,并且日期列的值是所选索引值的最大值。
我的数据框:
Index Start_Date End_Date
A 2017-10-01 2017-10-13
B 2017-10-07 2017-10-15
B 2017-10-18 np.Nat
C 2017-10-09 2017-10-30
所以我想为index
值"B"设置End_Date,其中Start_Date
是"B"的Max
最好的方法是什么?
编辑:
我的数据框:
Index Start_Date End_Date
A 2017-10-01 2017-10-13
B 2017-10-07 2017-10-15
B 2017-10-18 np.Nat
C 2017-10-09 2017-10-30
D 2017-11-01 np.Nat
E 2017-11-03 2017-11-09
E 2017-11-13 np.Nat
通过单独的过程,我了解到对应于行 #3 的End_Date(索引 == 'B',Start_Date == '2017-10-18 是 2017-10-25。 我还分别发现行 #5(索引 == 'D', Start_Date == '2017-11-01' 是 2017-11-03。 所以我想一次将这些值填充到End_Date中。 由于我没有最后一行的End_Date值(索引 = 'E',Start_Date == '2017-11-13'),它将保持为空。
请注意,"D"是唯一的,而"B"不是。
输出:
我的数据框:
Index Start_Date End_Date
A 2017-10-01 2017-10-13
B 2017-10-07 2017-10-15
B 2017-10-18 2017-10-25
C 2017-10-09 2017-10-30
D 2017-11-01 2017-11-03
E 2017-11-03 2017-11-09
E 2017-11-13 np.Nat
并不是说第 3 行中的值 2017-10-25 和 2017-11-03 来自另一个进程,我们可以假设它们存储在变量中 - 然后可用于填充初始数据帧以获取输出。
设置日期时间格式
df.End_Date=pd.to_datetime(df.End_Date,errors='coerce')
df.Start_Date=pd.to_datetime(df.Start_Date)
然后我们做apply
+fillna
df['End_Date']=df.groupby('Index').apply(lambda x : x['End_Date'].fillna(x['Start_Date'].max())).values
df
Out[277]:
Index Start_Date End_Date
0 A 2017-10-01 2017-10-13
1 B 2017-10-07 2017-10-15
2 B 2017-10-18 2017-10-18
3 C 2017-10-09 2017-10-30
# get the row indexes
row_idx = df.sort_values(['Index', 'Start_Date']).duplicated(keep='last')
# set values
df.loc[row_idx, 'End_Date'] = 'Your desired value'
希望对您有所帮助!
想通了:
df = df.reset_index()
删除标签作为索引,并给我一个具有唯一值的数字索引
Index Item Start_Date End_Date
0 A 2017-10-01 2017-10-13
1 B 2017-10-07 2017-10-15
2 B 2017-10-18 np.Nat
3 C 2017-10-09 2017-10-30
4 D 2017-11-01 np.Nat
5 E 2017-11-03 2017-11-09
6 E 2017-11-13 np.Nat
idx_val = df[df['Item'] == item][-1:].index.values[0]
为我提供的最大Start_Date
item
的索引值。
因此,如果我对来自其他进程item
"B"的End_Date
值为 '2017-10-25',我会使用上面的代码行获取具有item
B 的最大Start_Date
的行索引。 如果item
==B
,则idx_val
将等于 2。
然后,我只需为idx_val
== 2 的行设置End_Date
:
df.loc[idx_val, 'End_Date'] = pd.to_datetime('2017-10-25')
结果是:
Index Item Start_Date End_Date
0 A 2017-10-01 2017-10-13
1 B 2017-10-07 2017-10-15
2 B 2017-10-18 2017-10-25
3 C 2017-10-09 2017-10-30
4 D 2017-11-01 np.Nat
5 E 2017-11-03 2017-11-09
6 E 2017-11-13 np.Nat