Python Pandas 在 DataFrame 中设置值,其中 Index 具有多个相同的标签值



我想在 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_Dateitem的索引值。

因此,如果我对来自其他进程item"B"的End_Date值为 '2017-10-25',我会使用上面的代码行获取具有itemB 的最大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

相关内容

最新更新