Как я могу объединить .explode () панд с .split () на нескольких столбцах с одной дополнительной строкой - PullRequest
3 голосов
/ 07 октября 2019

Я хочу переставить Pandas Dataframe для включения дополнительной строки на основе значений в двух (или более) столбцах всякий раз, когда они включают разделитель. Эта дополнительная строка будет иметь все переменные, идентичные оригиналу, за исключением столбцов, в которых ищется разделитель. Если разделитель найден, я бы хотел дополнительную строку со вторыми элементами обоих столбцов (после разделителя). Следующий код работает для одного столбца и хорошо иллюстрирует мои цели:

df = pd.DataFrame([{'var1': 'a,b,c', 'var2': 1}, {'var1': 'd,e,f', 'var2': 2}])

df.assign(var1=df.var1.str.split(',')).explode('var1').reset_index(drop=True)

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

df = pd.DataFrame([{'var1': 'a,b,c', 'var2': 1, 'var3': 'I, II, III'}, {'var1': 'd,e,f', 'var2': 2, 'var3': 'IV, V, VI'}])

df.assign(var1=df.var1.str.split(','), var2=df.var2.str.split(',')).explode('var1').explode('var2').reset_index(drop=True)

Мне бы хотелось, чтобы во второй элемент обоих столбцов была включена одна строка, например:

df = pd.DataFrame([{'var1': 'a', 'var2': 1, 'var3': 'I'}, {'var1': 'b', 'var2': 1, 'var3': 'II'}, {'var1': 'c', 'var2': 1, 'var3': 'III'}, {'var1': 'd', 'var2': 2, 'var3': 'IV'}, {'var1': 'e', 'var2': 2, 'var3': 'V'}, {'var1': 'f', 'var2': 2, 'var3': 'VI'}])

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

Обратите внимание, что для каждой строки оба столбца разделителя всегда будут иметь одинаковое количество разделителей.

edit

Атрибут .explode () доступен только в pandas> = 0.25.x

1 Ответ

2 голосов
/ 07 октября 2019

В этом случае, если я правильно понимаю, лучше явно взорвать, чем использовать .explode метод (как это было сделано для панд <0.25.1). <a href="/10614855/kak-razvernut-vzorvat-stolbets-v-pande-dataframe"> Из method #2 этой темы вы можете

df.var1 = df.var1.str.split(',')
df.var3 = df.var3.str.split(',')

pd.DataFrame({'var1': np.concatenate(df.var1.values),
              'var2': df.var2.repeat(df.var1.str.len()), 
              'var3': np.concatenate(df.var3.values)})

  var1  var2  var3
0    a     1     I
0    b     1    II
0    c     1   III
1    d     2    IV
1    e     2     V
1    f     2    VI
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...