Python-熊猫-每个日期在一行上插入单个值

时间:2020-10-08 19:15:40

标签: python pandas

我需要创建一列,每隔24小时,第一条日期记录应包含最大值public class FuturesFilesMapping : BaseTypeConfiguration<FuturesFilesModel> { public FuturesFilesMapping() { var counterparty = Map(i => i.Counterparty).Constant("counterparty"); Map(i => i.TradeDate).Name("Trade Date").Index(1).TypeConverterOption.Format("dd/MM/yyyy"); Map(i => i.BmfAccount).Name("A/C Ref").Index(2); Map(i => i.Side).Name("B/S").Index(3); Map(i => i.Quantity).Name("Lots").Index(4); Map(i => i.Strike).Name("Strike").Index(5); Map(i => i.Type).Name("Type").Index(6); Map(i => i.Payout).Name("Call/Put").Index(7); Map(i => i.Price).Name("Price").Index(8); Map(i => i.Ticker).Name("Ric").Index(9); Map(i => i.Broker).Name("Exec Firm Name").Index(10); Map(i => i.Counterparty).Name("Contraparte").Index(11); Map(i => i.Desk).Name("Mesa").Index(12); Map(i => i.Exchange).Name("Exchange").Index(13); Map(i => i.ArrivalDate, ).Name("delivery").Index(14).TypeConverterOption.Format(FormatDate(counterparty)); Map(i => i.Currency).Name("Curr").Index(15); Map(i => i.ContractId).Name("Age").Index(16); } public static string FormatDate(string couterparty) { if (couterparty.Equals("FCM CITIGROUP GLOBAL MARKETS INC")) { return "MMM-yy"; } else { return "dd MMM yyy"; } } }

因此,新列df.score应该只包含一次daily_max_score(在第一个每日记录中,通常在00:00:00,但并非总是在该小时和分钟)。 / p>

将熊猫作为pd导入

df.score.max()

所需的数据框:

df = pd.DataFrame({
    'date': ['2019-04-19 23:00:00','2019-04-20 00:00:00','2019-04-20 01:00:00', '2019-04-05 08:00:00',
             '2019-07-31 23:30:00','2019-08-01 00:00:00','2019-08-01 01:00:00', '2019-08-01 02:00:00'],
    'ID': ['ID F', 'ID F', 'ID F', 'ID F',
             'ID B', 'ID B', 'ID B', 'ID B'],
    'score': ['50', '100', '99', '99',
             '75', '25', '25', '80']})

df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)

df

date    ID  score
0   2019-04-19 23:00:00 ID F    50
1   2019-04-20 00:00:00 ID F    100
2   2019-04-20 01:00:00 ID F    99
3   2019-04-05 08:00:00 ID F    99
4   2019-07-31 23:30:00 ID B    75
5   2019-08-01 00:00:00 ID B    25
6   2019-08-01 01:00:00 ID B    25
7   2019-08-01 02:00:00 ID B    80

1 个答案:

答案 0 :(得分:1)

首先,通过df['date'] = pd.to_datetime(df['date'])将文本日期值转换为实际日期时间。

然后通过df.groupby(df['date'].dt.date)分组日期。

获取每个日期的最高每日得分,首先将文本值转换为整数以获取最大值(与最大lex排序值相比)。将结果转换回字符串。

使用每个日期的最小日期时间的索引位置,即index=gb['date'].idxmin(),创建每日最高分数的数据框。

现在可以将索引为daily_max_score的此数据框连接到原始数据框(默认情况下在索引上连接),以产生所需的结果。

请注意,scoredaily_max_score仍然是字符串(即对象),这是它们最初分配的方式,因此被推断为所需的类型。

df['date'] = pd.to_datetime(df['date'])
gb = df.groupby(df['date'].dt.date)
max_daily_scores = gb['score'].apply(lambda x: x.astype(int).max()).astype(str)
daily_max_score = pd.DataFrame(
    max_daily_scores.tolist(), 
    index=gb['date'].idxmin(), 
    columns=['daily_max_score']
)

>>> df.join(daily_max_score)
                 date    ID score daily_max_score
0 2019-04-19 23:00:00  ID F    50              50
1 2019-04-20 00:00:00  ID F   100             100
2 2019-04-20 01:00:00  ID F    99             NaN
3 2019-04-05 08:00:00  ID F    99              99
4 2019-07-31 23:30:00  ID B    75              75
5 2019-08-01 00:00:00  ID B    25              80
6 2019-08-01 01:00:00  ID B    25             NaN
7 2019-08-01 02:00:00  ID B    80             NaN