Манипуляции с пандами данных - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть DataFrame A с одним столбцом location_ms. Я хочу разделить на ; и :, чтобы получить DataFrame B.

Фрейм данных A (начало):

Beginning

Фрейм данных B (окончательный):

Final

Мой код, приведенный ниже, выглядит очень окольным и хотел бы увидеть лучшую реализацию этой проблемы. Делая разбиения, я создаю DataFrame, каждый элемент которого представляет собой список списков. Затем я сглаживаю этот список списков для создания окончательного DataFrame.

def locpapersrc_table(df):
    toflattenrows = df['location_ms'].str.split(';').apply(lambda x:[c.split(':') for c in x]).values.tolist()
    singlelistoflist = [item for sublist in toflatten for item in sublist]
    tmp = pd.DataFrame(singlelistoflist)
    return tmp

Эта версия2 медленнее первой, но это еще один метод, который также очень окольным.

def version2(df):
   xx = df["location_ms"].str.split(';',expand = True).T
   tmp = pd.melt(xx).dropna().drop(['variable'],axis=1)['value'].str.split(':',expand=True)
   return tmp

Спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

Попробуйте что-то вроде этого.

split_df = df['location_ms'].str.split(pat=";", expand=True)

Добавьте что-то вроде этого, если вы хотите объединить его обратно в исходный фрейм данных.

df = df.merge(split_df, left_index=True, right_index=True)
df = df.drop('location_ms')

Для вашей новой проблемы (разделение по; и :):

split_df = df['location_ms'].str.split(pat=";", expand=True)
subsplit_df = pd.DataFrame(index = split_df.index)
for i in range(split_df.shape[1]):
    subsplit_df = subsplit_df.merge(split_df.iloc[:, i].str.split(pat=":", expand=True), left_index=True, right_index=True)
subsplit_df.columns = range(subsplit_df.shape[1])

Вы можете объединить его, как указано выше, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...