Pandas: эффективный способ отображения подмножеств нескольких столбцов в подмножеств одного столбца - PullRequest
0 голосов
/ 15 февраля 2019

Проблема

Я пытаюсь объединить / объединить наборы из нескольких столбцов с одинаковыми именами в наборы из отдельных столбцов.Например:

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

    A    A     A     B     B
  0 cute tall tall  NaN   old
  1 NaN  NaN   5    NaN   NaN
  2  1   old   NaN  cute  big

Моя цель состоит в том, чтобы сопоставить каждое подмножество (AAA & BB) с его собственным одиночнымподмножество столбцов.Следующий желательный вывод иллюстрирует эту идею:

      A_new          B_new
 0   "cute, tall"    "old"
 1   "5"              NaN
 2   "1, old"        "cute, big"

Чтобы получить здесь, я применяю следующие 3 простые логики к входному фрейму данных:

  1. Объединяем все не-NaN значения ви сохраните его в новом столбце.
  2. При объединении значений, отличных от NaN, проверяйте наличие дубликатов и возвращайте только те, которые не являются дубликатами
  3. Если все значения являются NaN, возвращайте NaN

Мое текущее решение основано на циклах for, повторяющихся в каждой строке.Однако этот подход очень медленный, и мой фрейм данных довольно большой, поэтому мне интересно, есть ли более эффективный / быстрый способ достижения этого?

Это мое текущее (очень медленное) решение:

for c,j in tqdm(enumerate(columns)): # columns is a list holding all the relevant column names
    merged_values = []
    for i in (range(0,len(df))):
        values = [x for x in df[j].iloc[i] if x is not np.nan]
        values = list(set(values))
        if values == []:
            values = np.nan
        #print(values)
        elif len(values) > 1:
            values = ", ".join(values)
        else:
            values = values[0]
        merged_values.append(values)
    if c == 0:
        data = pd.DataFrame(merged_values,columns=[j+"_new"])
    else:
        data[j] = pd.DataFrame(merged_values,columns=[j+"_new])

1 Ответ

0 голосов
/ 15 февраля 2019

Сначала вам нужно stack, затем groupby с join, а затем преобразовать обратно, используя unstack

df.stack().groupby(level=[0,1]).apply(lambda x : ','.join(set(x))).unstack()
Out[237]: 
           A         B
0  cute,tall       old
1          5       NaN
2      1,old  big,cute
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...