Набор данных срезов по серии по условию - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть набор данных:

data = {'host': ['A','A','A','A','A','A','B','B','B','B','B','B'],
       'TS': ['1','2', '3', '7', '9','11','7','8','9','14','16', '18'], 
       'Predict' : ['None','None', '134','None','None', '127','None','None', '121','None','None', '124']}

Я хочу разделить набор данных на ряд значений None и получить разницу во времени этого ряда.

У меня есть функция для разницы во времени. И попробуйте извлечь индекс для ряда, но не знаете, как он использует

def timediffs(series):
    series['tdiff'] = series['ts'].diff().fillna(0.0)
    return series
predict_index = df.index.where(df['Predict'].notna()).to_series().bfill()

Наконец, я хочу получить набор данных следующим образом:

new_data = {'host': ['A','A','A','A','A','A','B','B','B','B','B','B'],
       'TS': ['1','2', '3', '7', '9','11','7','8','9','14','16', '19'], 
       'Predict' : ['None','None', '134','None','None', '127','None','None', '121','None','None', '124'],
        'Time_diff' : ['0','1','1','0','2','2', '0','1','1','0','2','3',],
        'New_predict' : ['134','134','134','127','127','127','121','121','121','124','124','124',]
       }

new_df = pd.DataFrame(new_data)

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Сначала мы заменим 'None' на NaN. Затем мы используем backfill (bfill), чтобы сделать наш столбец, New_predict и, наконец, мы используем GroupBy.diff, чтобы получить Time_diff:

df['New_predict'] = df.replace('None', np.NaN).loc[:, 'Predict'].bfill()
# df['TS'] = df['TS'].astype(int)
df['Time_diff'] = df.groupby('New_predict')['TS'].diff().fillna(0)

   host  TS Predict New_predict  Time_diff
0     A   1    None         134        0.0
1     A   2    None         134        1.0
2     A   3     134         134        1.0
3     A   7    None         127        0.0
4     A   9    None         127        2.0
5     A  11     127         127        2.0
6     B   7    None         121        0.0
7     B   8    None         121        1.0
8     B   9     121         121        1.0
9     B  14    None         124        0.0
10    B  16    None         124        2.0
11    B  18     124         124        2.0
1 голос
/ 04 ноября 2019

В ваших данных образца сначала необходима предварительная обработка данных - конвертируйте TS в числовое значение и Predict None в строках в NaN или не тип:

df['TS'] = df['TS'].astype(int)
df['Predict'] = pd.to_numeric(df['Predict'], errors='coerce')
#if need replace strings None to NaN 
#df['Predict'] = df['Predict'].mask(df['Predict'] == 'None')

Затем только обратно заполняйте недостающие данныев столбце Predict и для Time_diff используйте DataFrameGroupBy.diff с заменой первых значений на 0:

df['New_predict'] = df['Predict'].bfill()
df['Time_diff'] = df.groupby('New_predict')['TS'].diff().fillna(0).astype(int)
print (df)
   host  TS  Predict  New_predict  Time_diff
0     A   1      NaN        134.0          0
1     A   2      NaN        134.0          1
2     A   3    134.0        134.0          1
3     A   7      NaN        127.0          0
4     A   9      NaN        127.0          2
5     A  11    127.0        127.0          2
6     B   7      NaN        121.0          0
7     B   8      NaN        121.0          1
8     B   9    121.0        121.0          1
9     B  14      NaN        124.0          0
10    B  16      NaN        124.0          2
11    B  18    124.0        124.0          2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...