我如何迭代熊猫数据框架并获取与给定dateTime相关联的所有列的值,即前向填充值为-1?

假设您有一个带有5列的pandas dataframe:一个称为code的字符串,一个名为calendardate格式的名为datetime的字符串,其中包含日期和时间信息,另外三个名为ABC和,每个名为包含一个从-1到100的整数。

对于每个代码值,可以有多个日历。这些条目之间有典型的间隔(例如,5分钟或1小时等)。这个间隔有时可能会有所不同。

我们如何在calendardate列中迭代每个唯一的dateTime值(我们称其为n),对于每个值n,请使用值n的数组,以及列代码,a,b和c的值,以便如果a,b或c等于-1,然后我们得到与同一代码不关联的a,b或c的最新值?

换句话说,我想为每个给定的DateTime值打印出数据框的每个片段,其最新值的a,b和c的最新值不得为-1。

这是我的尝试:

import pandas as pd

# Sample DataFrame
data = {
    'code': ['A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'B1', 'B1', 'B1', 'B1'],
    'calendardate': [
        '2024-02-29 09:00:00', '2024-02-29 09:05:00', '2024-02-29 09:10:00', '2024-02-29 09:15:00',
        '2024-02-29 09:20:00', '2024-02-29 09:25:00', '2024-02-29 09:00:00', '2024-02-29 09:05:00',
        '2024-02-29 09:10:00', '2024-02-29 09:15:00'
    ],
    'A': [10, -1, 20, -1, 30, 40, 50, -1, -1, 60],
    'B': [-1, 15, -1, 25, -1, 35, -1, 45, -1, -1],
    'C': [-1, -1, -1, 35, -1, -1, -1, -1, 55, 65]
}

df = pd.DataFrame(data)
df['calendardate'] = pd.to_datetime(df['calendardate'])

# Define a function to fill missing values with the most recent non-missing value for each column independently
def forward_fill(group):
    # Sort the group by 'calendardate' in ascending order
    group = group.sort_values(by='calendardate')

    # Forward fill missing values in column A, B and C
    group['A'] = group['A'].replace(-1, pd.NA).ffill()
    group['B'] = group['B'].replace(-1, pd.NA).ffill()
    group['C'] = group['C'].replace(-1, pd.NA).ffill()
    return group

# Apply the function within each group defined by 'calendardate'
filled_df = df.groupby('calendardate').apply(forward_fill).reset_index(drop=True)

# Iterate through each row and print the values for columns A, B, and C
for index, row in filled_df.iterrows():
    print("Datetime:", row['calendardate'])
    print("Code:", row['code'])
    print("A:", row['A'])
    print("B:", row['B'])
    print("C:", row['C'])
    print("------------------------")

它非常接近,但是在前三个迭代中,我得到了:

Datetime: 2024-02-29 09:00:00
Code: A1
A: 10
B: <NA>
C: nan
------------------------
Datetime: 2024-02-29 09:00:00
Code: B1
A: 50
B: <NA>
C: nan
------------------------
Datetime: 2024-02-29 09:05:00
Code: A1
A: nan
B: 15
C: nan

当第三次迭代应打印时:

Datetime: 2024-02-29 09:05:00
Code: A1
A: 10
B: 15
C: nan

因为对于A列,在时间戳2024-02-29 09:05:00之前有一个值不是-1(因此应打印最新的非-1值而不是NaN)。

我该如何在大熊猫中实现这一目标?我正在使用2.2.1版

谢谢你!

0 个回答

  • 5 浏览
  • Edy Bourne 提出于 2024-03-02 04:55:31

相似问题