Как объединить кадры данных Pandas, которые соответствуют определенным критериям в их столбцах Multiindex в Python - PullRequest
0 голосов
/ 29 января 2019

У меня есть два следующих кадра данных:

d1 = {('CAR','ALPHA'): pd.Series(['A11', 'A12', 'A13', 'A14'],index=[1, 2, 3, 4]),
      ('CAR','BETA'): pd.Series(['B11', 'B12', 'B13', 'B14'],index=[1, 2, 3, 4])}
da= pd.DataFrame(data=d1)
d2 = {('CAR','ALPHA'): pd.Series(['A22', 'A23', 'A24', 'A25'],index=[2, 3, 4, 5]), 
      ('CAR','BETA'): pd.Series(['B22', 'B23', 'B24', 'B25'],index=[2, 3, 4, 5]),
      ('MOTOR','SOLO'): pd.Series(['S22', 'S23', 'S24', 'S25'], index=[2, 3, 4, 5])}
db= pd.DataFrame(data=d2)

Они должны выглядеть так:

enter image description here

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

Например, я хотел бы, чтобы все столбцы с CAR были вверхний уровень столбца:

enter image description here

Моя версия pandas - 0.21.0, а имена столбцов в моей сложной версии кода следующие:

df = pd.concat([da, db], axis=1)
print(df.columns)
Index([('V', 'C', 'I', 'P'),
       ('V', 'G', 'T', '-'),
       ('P', 'G', 'T', '-')], dtype='object')

И что касается вышесказанного, я хочу сохранить только столбцы с V на первом уровне мультииндекса столбцов.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Использование isin

pd.concat([da,db.loc[:,db.columns.isin(da.columns)]],1)
Out[733]: 
    CAR                
  ALPHA BETA ALPHA BETA
1   A11  B11   NaN  NaN
2   A12  B12   A22  B22
3   A13  B13   A23  B23
4   A14  B14   A24  B24
5   NaN  NaN   A25  B25
0 голосов
/ 29 января 2019

Используйте pandas.concat с DataFrame.xs:

df = pd.concat([da, db], axis=1).xs('CAR', level=0, axis=1, drop_level=False)

Или используйте слайсеры :

df = pd.concat([da, db], axis=1).loc[:, pd.IndexSlice['CAR', :]]

print (df)
    CAR                
  ALPHA BETA ALPHA BETA
1   A11  B11   NaN  NaN
2   A12  B12   A22  B22
3   A13  B13   A23  B23
4   A14  B14   A24  B24
5   NaN  NaN   A25  B25

РЕДАКТИРОВАТЬ:

Существует 4 уровня DataFrame, поэтому необходимо:

idx = pd.Index([('V', 'C', 'I', 'P'),
       ('V', 'G', 'T', '-'),
       ('P', 'G', 'T', '-')], dtype='object')
df = pd.DataFrame(0, columns=idx, index=[1,2])
print (df)
   V     P
   C  G  G
   I  T  T
   P  -  -
1  0  0  0
2  0  0  0


df1 = df.xs('V', level=0, axis=1, drop_level=False)
print (df1)
   V   
   C  G
   I  T
   P  -
1  0  0
2  0  0

Добавить : для каждого уровня, чтобы выбрать все значения второго, третьего ответачетвертые уровни:

df1 = df.loc[:, pd.IndexSlice['V', :, :, :]]
print (df1)
   V   
   C  G
   I  T
   P  -
1  0  0
2  0  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...