У меня есть фрейм данных на основе даты и времени, как показано ниже,
timestamp value ... metric
36 2014-04-02 17:20:00 125.098263 ... 25.098263
14 2014-04-06 16:25:00 140.072787 ... 265.171050
10 2014-04-11 09:00:00 127.882020 ... 393.053070
45 2014-04-11 09:05:00 115.705719 ... 508.758789
24 2014-04-11 09:15:00 127.261178 ... 636.019967
17 2014-04-11 09:20:00 121.157997 ... 757.177965
49 2014-04-11 09:25:00 120.468468 ... 877.646433
8 2014-04-11 09:45:00 135.642696 ... 1013.289128
33 2014-04-11 09:55:00 125.210049 ... 1138.499178
19 2014-04-11 10:05:00 159.259713 ... 1297.758890
52 2014-04-11 10:20:00 150.082482 ... 1447.841373
Я хочу создать новый столбец с именем «diff_col», содержащий либо «одинаковые», либо «diff» значения. Если дата не является непрерывной, она будет принята как «diff», в противном случае она будет «такой же». В приведенном выше кадре данных 2014-04-02 17:20:00 и 2014-04-06 16:25:00 - разные даты по сравнению с остальными значениями даты и времени.
Как создать diff_col .
Я пытался, df['diff_col']=df.groupby(pd.Grouper(key = 'timestamp', freq='1D'))
но он неправильно создал ожидаемый столбец. Мой требуемый фрейм данных, как показано ниже,
timestamp value ... metric diff_col
36 2014-04-02 17:20:00 125.098263 ... 25.098263 diff
14 2014-04-06 16:25:00 140.072787 ... 265.171050 diff
10 2014-04-11 09:00:00 127.882020 ... 393.053070 same
45 2014-04-11 09:05:00 115.705719 ... 508.758789 same
24 2014-04-11 09:15:00 127.261178 ... 636.019967 same
17 2014-04-11 09:20:00 121.157997 ... 757.177965 same
49 2014-04-11 09:25:00 120.468468 ... 877.646433 same
8 2014-04-11 09:45:00 135.642696 ... 1013.289128 same
33 2014-04-11 09:55:00 125.210049 ... 1138.499178 same
19 2014-04-11 10:05:00 159.259713 ... 1297.758890 same
52 2014-04-11 10:20:00 150.082482 ... 1447.841373 same
Пожалуйста, предоставьте предложение по этому поводу.
Спасибо, Кумар
Вы можете сравнить последовательные строки, чтобы увидеть, является ли это одной и той же датой (извлеченной с помощью dt.normalize ), и использовать это как группировщик, чтобы получить размер с помощью groupby.transform('size') , если размер > 1, установите «такой же», иначе «diff» с помощью numpy.where:
import numpy as np
# ensure datetime
df['timestamp'] = pd.to_datetime(df['timestamp'])
# get day
s = df['timestamp'].dt.normalize()
# compare successive rows and identify group size
df['diff_col'] = np.where(df.groupby(s.ne(s.shift()).cumsum())
.transform('size').gt(1),
'same', 'diff')
Выход:
timestamp value ... metric diff_col
36 2014-04-02 17:20:00 125.098263 ... 25.098263 diff
14 2014-04-06 16:25:00 140.072787 ... 265.171050 diff
10 2014-04-11 09:00:00 127.882020 ... 393.053070 same
45 2014-04-11 09:05:00 115.705719 ... 508.758789 same
24 2014-04-11 09:15:00 127.261178 ... 636.019967 same
17 2014-04-11 09:20:00 121.157997 ... 757.177965 same
49 2014-04-11 09:25:00 120.468468 ... 877.646433 same
8 2014-04-11 09:45:00 135.642696 ... 1013.289128 same
33 2014-04-11 09:55:00 125.210049 ... 1138.499178 same
19 2014-04-11 10:05:00 159.259713 ... 1297.758890 same
52 2014-04-11 10:20:00 150.082482 ... 1447.841373 same
@user680288 user680288 нет, это не то же самое, что df.size
, здесь имеется в виду количество строк, включая NaN
И в любом случае, transform
работает с сериями, поэтому данные одномерные.
Привет, mozway, почему вы используете «размер» в качестве параметра для преобразования здесь. размер означает строки * столбцы. почему не только строки.