这是我的问题的一个简化的例子。2我有一个带有文件名和修改日期的 Dataframe 。3我需要一个由文件名表示的最新文件的标志。4最新= 1;非最新= 0
我有这个代码到目前为止:
import pandas as pd
df = pd.DataFrame({
'FileName' : ['file1.txt', 'file2.txt', 'file3.txt', 'file1.txt', 'file4.txt', 'file3.txt'],
'FileModDate' : ['2022-02-22 10:28:18', '2022-02-22 11:28:18', '2022-02-22 12:28:18', '2022-02-22 14:28:18', '2022-02-22 08:28:18', '2022-02-22 15:28:18'],
'DataDate' : ['2024-02-22 10:28:18', '2021-02-22 11:28:18', '2021-02-22 12:28:18', '2021-02-22 14:28:18', '2021-02-22 08:28:18', '2021-02-22 15:28:18']
})
df=df.sort_values('FileModDate',ascending=False)
print (df)
grouped=df.groupby('FileName').first()
grouped['LatestFile']=1
print (grouped)
结果为:
FileModDate LatestFile
FileName
file1.txt 2022-02-22 14:28:18 1
file2.txt 2022-02-22 11:28:18 1
file3.txt 2022-02-22 15:28:18 1
file4.txt 2022-02-22 08:28:18 1
我不知道这是不是正确的方法,我怎样才能把行放到这个 Dataframe 中,而这个 Dataframe 不在grouby.first()中。
因此,结果应如下所示:
FileModDate LatestFile
FileName
file1.txt 2022-02-22 14:28:18 1
file2.txt 2022-02-22 11:28:18 1
file3.txt 2022-02-22 15:28:18 1
file4.txt 2022-02-22 08:28:18 1
file3.txt 2022-02-22 12:28:18 0
file1.txt 2022-02-22 10:28:18 0
贝斯特齐奥
编辑:
根据第一个标志,我还需要一个标志:
如果LatestFile = 1,则标志DataDate应仅为1,因此输出为:
FileName FileModDate DataDate LatestFile DataDateFlag
0 file1.txt 2022-02-22 10:28:18 2024-02-22 10:28:18 0 0
1 file2.txt 2022-02-22 11:28:18 2021-02-22 11:28:18 1 1
2 file3.txt 2022-02-22 12:28:18 2021-02-22 12:28:18 0 0
3 file1.txt 2022-02-22 14:28:18 2021-02-22 14:28:18 1 1
4 file4.txt 2022-02-22 08:28:18 2021-02-22 08:28:18 1 1
5 file3.txt 2022-02-22 15:28:18 2021-02-22 15:28:18 1 1
我试过这样的方法:
df["DataDateFlag"] = (
df
.groupby("FileName")["DataDate"]
.transform("max")
.eq(df["DataDate"])
.astype(int)
.filter(df["LatestFile"]==1)
)
3条答案
按热度按时间ecbunoof1#
您可以将每个组转换为其最大日期:这将保存对数组排序的需求,并允许您直接与实际日期进行比较:
输出(按原始顺序):
wgx48brx2#
可以使用布尔值代替0/1:
输出:
46qrfjad3#
如果您的数据已经按日期排序,则可以使用
groupby.cumcount
枚举组项以选择第一个(0
):输出: