我有以下两个数据框:
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)
它们应该看起来像这样:
我要实现的目标是在一个新的数据框中添加两个数据框的所有列,这些列在Column索引之一中具有特定的单词。
例如,我想在顶层列中包含所有具有CAR的列:
我的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')
在上面,我只想在列multiindex的第一级中保留V列。
谢谢。
答案 0 :(得分:2)
将pandas.concat
与DataFrame.xs
一起使用:
df = pd.concat([da, db], axis=1).xs('CAR', level=0, axis=1, drop_level=False)
或使用slicers:
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
编辑:
DataFrame有4个级别,因此需要:
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
答案 1 :(得分:2)
使用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