дублировать один столбец с несколькими именами в Пандах - PullRequest
0 голосов
/ 01 июня 2018

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

Мне нужно сделать в пандах следующее:

enter image description here

Есть ли у вас какие-нибудь приятные трюки с пандазами?

Здесьпростой код:

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.random(size=(5,6)), 
                  columns={'a', 'b', 'c, d', 'e', 'f, g', 'h'})


df=
          a         b      c, d         e      f, g         h
0  0.771418  0.371685  0.072876  0.153071  0.169513  0.399769
1  0.667551  0.886779  0.949341  0.869588  0.226275  0.273370
2  0.768456  0.945822  0.167757  0.584886  0.328152  0.246415
3  0.354713  0.690585  0.027916  0.237110  0.875449  0.430142
4  0.590518  0.819043  0.803876  0.909385  0.382452  0.867369

Мне нужно:

df_new = 

          a         b         c         d         e         f         g         h
0  0.771418  0.371685  0.072876  0.072876  0.153071  0.169513  0.169513  0.399769
1  0.667551  0.886779  0.949341  0.949341  0.869588  0.226275  0.226275  0.273370
2  0.768456  0.945822  0.167757  0.167757  0.584886  0.328152  0.328152  0.246415
3  0.354713  0.690585  0.027916  0.027916  0.237110  0.875449  0.875449  0.430142
4  0.590518  0.819043  0.803876  0.803876  0.909385  0.382452  0.382452  0.867369

ОБНОВЛЕНИЕ

И что произойдет, если у меня будут повторяться имена столбцов:

df = pd.DataFrame(data=np.random.random(size=(5,6)), 
                      columns={'a', 'b', 'c, d', 'c', 'f, g', 'h'})

и желаемые результаты должны быть

df_new_v2 =

          a         b         c         d       c.1         f         g         h
0  0.771418  0.371685  0.072876  0.072876  0.153071  0.169513  0.169513  0.399769
1  0.667551  0.886779  0.949341  0.949341  0.869588  0.226275  0.226275  0.273370
2  0.768456  0.945822  0.167757  0.167757  0.584886  0.328152  0.328152  0.246415
3  0.354713  0.690585  0.027916  0.027916  0.237110  0.875449  0.875449  0.430142
4  0.590518  0.819043  0.803876  0.803876  0.909385  0.382452  0.382452  0.867369

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Это довольно простой подход

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.random(size=(5,6)), 
              columns={'a', 'b', 'c, d', 'e', 'f, g', 'h'})

new_df = pd.DataFrame()
for x in df.columns:
    split = x.split(',')
    for s in split:
        new_df[s] = df[x]

df = 
    f, g        h           c, d        e           a           b
0   0.104359    0.746843    0.672964    0.085768    0.088580    0.152405
1   0.530228    0.841193    0.023619    0.619892    0.254405    0.776631
2   0.193094    0.530332    0.660067    0.308105    0.936816    0.067757
3   0.314124    0.143150    0.351160    0.681030    0.307738    0.786784
4   0.214116    0.445849    0.139659    0.062285    0.835806    0.781299

new_df =
    f           g           h           c           d           e           a           b
0   0.104359    0.104359    0.746843    0.672964    0.672964    0.085768    0.088580    0.152405
1   0.530228    0.530228    0.841193    0.023619    0.023619    0.619892    0.254405    0.776631
2   0.193094    0.193094    0.530332    0.660067    0.660067    0.308105    0.936816    0.067757
3   0.314124    0.314124    0.143150    0.351160    0.351160    0.681030    0.307738    0.786784
4   0.214116    0.214116    0.445849    0.139659    0.139659    0.062285    0.835806    0.781299
0 голосов
/ 01 июня 2018

Вы можете создать сначала MultiIndex в столбцах с помощью параметра header, а затем выполнить цикл по первому уровню с помощью concat:

df = pd.read_csv(file, header=[0,1])

L = []
cols = df.columns.get_level_values(0)
for x in cols:
    c = df[x].columns.str.split(',')[0]
    a = pd.concat([df[x].squeeze()] * len(c), axis=1, keys=c)
    L.append(a)
df = pd.concat(L, axis=1, keys=cols)

С примерами данных:

df = pd.DataFrame(data=np.random.random(size=(5,6)), 
                      columns={'a', 'b', 'c, d', 'c', 'f, g', 'h'})

#print (df)
L = []
for x in df.columns:
    c = x.split(', ')
    a = pd.concat([df[x].squeeze()] * len(c), axis=1, keys=c)
    L.append(a)

df = pd.concat(L, axis=1)
s = df.columns.to_series()
df.columns = s + s.groupby(s).cumcount().astype(str).radd('.').str.replace('.0', '')

print (df)
          c         h         a       c.1         d         b         f  \
0  0.846482  0.285415  0.695800  0.497593  0.497593  0.159911  0.286545   
1  0.195390  0.369074  0.371147  0.102207  0.102207  0.924279  0.349958   
2  0.967811  0.059451  0.942390  0.826203  0.826203  0.722080  0.196833   
3  0.546076  0.789354  0.876819  0.243305  0.243305  0.391054  0.213517   
4  0.311528  0.544023  0.380844  0.308427  0.308427  0.511651  0.795380   

          g  
0  0.286545  
1  0.349958  
2  0.196833  
3  0.213517  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...