Объединить связанные поля и заменить их внутри фрейма данных - PullRequest
0 голосов
/ 20 апреля 2019

Я нахожусь в процессе объединения двух связанных полей в большом наборе данных.Я чувствую, что у меня есть большая часть того, что мне нужно, но я не могу правильно распределить поля.

dataframe:

id| date1foo| time1bar| date2foo| time2bar| date3foo | time3bar
--|---------|---------|---------|---------|----------|--------
2 |1/4/2017 |01:03:45 |1/4/2017 |01:03:45 |1/4/2019  |12:44:45
3 |2/4/2017 |03:12:32 |2/4/2017 |03:16:23 |3/4/2019  |22:32:55
4 |2/5/2017 |04:11:54 |7/5/2017 |06:23:31 |2/19/2019 |19:03:11
5 |2/6/2017 |02:15:34 |9/15/2017|01:12:32 |3/15/2019 |11:11:11
6 |3/17/2017|04:44:12 |10/3/2017|07:19:52 |4/4/2019  |07:03:14

Мне нужно заменить эти поля новыми объединенными полями.Итак:

id| datetime1        | datetime2        | datetime3   
--|------------------|------------------|------------------|
2 |1/4/2017 01:03:45 |1/4/2017 01:03:45 |1/4/2019 12:44:45
3 |2/4/2017 03:12:32 |2/4/2017 03:16:23 |3/4/2019 22:32:55
4 |2/5/2017 04:11:54 |7/5/2017 06:23:31 |2/19/2019 19:03:11
5 |2/6/2017 02:15:34 |9/15/2017 01:12:32|3/15/2019 11:11:11
6 |3/17/2017 04:44:12|10/3/2017 07:19:52|4/4/2019 07:03:14

Я чувствую, что приближаюсь к тому, что у меня ниже.

код:

pattern_date = re.compile("date[0-9]{1,2}foo")
pattern_time = re.compile("time[0-9]{1,2}bar")

cols_date = [pattern_date.match(x).group() for x in df.columns if
        pattern_date.match(x) is not None]

cols_time = [pattern_time.match(x).group() for x in df.columns if
        pattern_time.match(x) is not None]


df[cols_time] = df[cols_date].applymap(lambda x: str(x) + [i for i in df[cols_date]])

# renaming fields code would go here

Что мне здесь не хватает?Есть лучший способ сделать это?Любая помощь приветствуется.

Заранее спасибо!

1 Ответ

1 голос
/ 20 апреля 2019

Мы можем использовать DatFrame.filter и получить доступ к этим столбцам, сжав их, чтобы мы соответствовали date и time:

df_new = pd.DataFrame({'id':df.id.values})

for index, cols in enumerate(zip(df.filter(regex='^date').columns, df.filter(regex='^time').columns)):
    df_new[f'datetime{index+1}'] = df[cols[0]] + ' ' + df[cols[1]]

print(df_new)
   id           datetime1           datetime2           datetime3
0   2   1/4/2017 01:03:45   1/4/2017 01:03:45   1/4/2019 12:44:45
1   3   2/4/2017 03:12:32   2/4/2017 03:16:23   3/4/2019 22:32:55
2   4   2/5/2017 04:11:54   7/5/2017 06:23:31  2/19/2019 19:03:11
3   5   2/6/2017 02:15:34  9/15/2017 01:12:32  3/15/2019 11:11:11
4   6  3/17/2017 04:44:12  10/3/2017 07:19:52   4/4/2019 07:03:14

Что означает DataFrame.filterделать точно?Он возвращает столбцы, которые соответствуют регулярному выражению:

print(df.filter(regex='^date'))
    date1foo   date2foo   date3foo
0   1/4/2017   1/4/2017   1/4/2019
1   2/4/2017   2/4/2017   3/4/2019
2   2/5/2017   7/5/2017  2/19/2019
3   2/6/2017  9/15/2017  3/15/2019
4  3/17/2017  10/3/2017   4/4/2019

print(df.filter(regex='^time'))

   time1bar  time2bar  time3bar
0  01:03:45  01:03:45  12:44:45
1  03:12:32  03:16:23  22:32:55
2  04:11:54  06:23:31  19:03:11
3  02:15:34  01:12:32  11:11:11
4  04:44:12  07:19:52  07:03:14

Примечание Я использовал f-strings, который поддерживается только в Python> 3.5.Если ваша версия Python ниже, используйте следующее:

df_new['datetime{}'.format(index+1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...