Как изменить форму данных с пандами - PullRequest
0 голосов
/ 23 мая 2018

У меня есть кадр данных, как показано на рисунке ниже, как эффективно получить все значения с помощью «:» в ячейке и создать новый кадр данных?Например, «cnt: 1» должен быть преобразован в «1»;«ack: dsn: 113» преобразуется в «113» и т. д. enter image description here

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

С pandas.DataFrame.replace с использованием regex=True

df.replace('(.*:)', '', regex=True)

   dsn cnt retry rssir lqir rssif lqif
0  113   1     1   -24    6   -49    5
1  114   2     1   -24   10   -49   15
2  115   3     1   -24    5   -59   14
3  116   4     1   -24    8   -58   11
4  117   5     1   -24   12   -57   14

Более громоздким с функциями Numpy string

from numpy.core.defchararray import rsplit

pd.DataFrame(
    np.array(
        [t[1] for t in rsplit(
            df.values.ravel().astype(str), ':', 1
        )]
    ).reshape(df.shape),
    df.index, df.columns
)

   dsn cnt retry rssir lqir rssif lqif
0  113   1     1   -24    6   -49    5
1  114   2     1   -24   10   -49   15
2  115   3     1   -24    5   -59   14
3  116   4     1   -24    8   -58   11
4  117   5     1   -24   12   -57   14
0 голосов
/ 23 мая 2018

Вы можете использовать rsplit с пределом 1 и выбирать вторые значения list s:

df = df.applymap(lambda x: x.rsplit(':', 1)[1])

Или:

df = df.apply(lambda x: x.str.rsplit(':', 1).str[1])

print (df)
   dsn cnt retry rssir lqir rssif lqif
0  113   1     1   -24    6   -49    5
1  114   2     1   -24   10   -49   15
2  115   3     1   -24    5   -59   14
3  116   4     1   -24    8   -58   11
4  117   5     1   -24   12   -57   14

Или прощекак указано Антон vBR :

df = df.applymap(lambda x: x.rsplit(':')[-1])

df = df.apply(lambda x: x.str.rsplit(':').str[-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...