Объединение разных столбцов с перекрывающимся индексом в пандах - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть пандас Dataframe, который выглядит следующим образом:

  ABC_1 ABC_2 ABC_3 ABC_4
    x    y       z    k
    NaN  y       NaN  k
    x    NaN      z   NaN
    x    NaN      z   k
    ...  ...     ...  ...

Это всего лишь один столбец ABC, который был разбит на множество столбцов.Точно так же есть другие столбцы, такие как PQR, которые были разделены на разные части.

  • Каждый столбец содержит 100 значений (включая NaN), т. Е. Форму df можно рассматривать как (100,4).
  • Я хочу объединить всечетыре столбца в один столбец с именем ABC, но он должен содержать все значения из всех четырех столбцов.NaN значения могут быть удалены заранее или после объединения, так что это не проблема, хотя я чувствую, что удаление всех NaNs сразу после объединения будет более эффективным.

Короче говоря, новый столбец долженвыглядит так:

   ABC
   x
   x
   x
   y
   y
   z
   z
   z
   k
   k
   k
   ...

То, что я пробовал:

Я пытался использовать pd.concat, но это не сработало, так как выдает duplicate index error, что очевидно из этого случая.Теперь есть способы справиться с этим, но я не думаю, что он будет эффективен в вычислительном отношении, если фрейм данных достаточно большой.

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

Может кто-нибудь сказать, пожалуйста, как это сделать эффективно?

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

ABC_1 ABC_2 ABC_3 ABC_4 ABC_5_patt
    x    y       z    k    p
    NaN  y       NaN  k    p
    x    NaN      z   NaN  p
    x    NaN      z   k    NaN
    ...  ...     ...  ...  ...

Ответы [ 2 ]

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

Используйте unstack с dropna и для удаления MultiIndex reset_index, последний to_frame для конвертируемых серийв один столбец DataFrame:

df = df.unstack().dropna().reset_index(drop=True).to_frame('ABC')
print (df)
   ABC
0    x
1    x
2    x
3    y
4    y
5    z
6    z
7    z
8    k
9    k
10   k

Если возможно, несколько категорий:

print (df)
  ABC_1 PQR_2 ABC_3 PQR_4
0     x     y     z     k
1   NaN     y   NaN     k
2     x   NaN     z   NaN
3     x   NaN     z     k

df.columns = df.columns.str.split('_', expand=True)
df = df.unstack().dropna().reset_index(level=[1,2],drop=True)
df.index = [df.groupby(level=0).cumcount(), df.index]
df = df.unstack()
print (df)
  ABC  PQR
0   x    y
1   x    y
2   x    k
3   z    k
4   z    k
5   z  NaN
0 голосов
/ 21 ноября 2018
import numpy as np
x = {"ABC_1": [1, np.nan, 2], "ABC_2": [3, 4, np.nan]}
df = pd.DataFrame(x)

Вот как выглядит df:

   ABC_1  ABC_2
0    1.0    3.0
1    NaN    4.0
2    2.0    NaN

Вы можете создать серию, подобную этой:

s = pd.concat([df[col] for col in df.columns])
s = s[s.notnull()] 

Так выглядит s:

0    1.0
2    2.0
0    3.0
1    4.0

Вы можете переиндексировать s при необходимости

...