name address contact_info
first_name last_name stret city mobile email
1 AAA BBB XXX YYY 02020 aaa@xyz.com
2 111 222 333 444 239393 bbb@xyz.com
我有以上格式的擅长。我想要的是将名称中的每一列都放在 contact_info 中的移动列中,有人请告诉我如何执行此操作。以下代码为我提供了名称和 contact_info
内的所有内容import pandas as pd
df = pd.read_excel("test.xlsx", header=[0, 1], sheet_name="Mapping")
print df[["name", "contact_info"]]
我想尝试这样的事情,
first_name last_name mobile
AAA BBB 102020
111 222 239393
答案 0 :(得分:3)
您可以在此处使用df.xs
:
i = df.xs('name', axis=1)
j = df.xs('mobile', axis=1, level=-1)
pd.concat([i, j], axis=1)
first_name last_name contact_info
1 AAA BBB 2020
2 111 222 239393
答案 1 :(得分:2)
使用IndexSlice
+ concat
idx = pd.IndexSlice
pd.concat([df.loc[:, idx['name',:]],df.loc[:,idx[:,'mobile']]])
Out[104]:
contact_info name
mobile first_name last_name
1 NaN AAA BBB
2 NaN 111 222
1 2020 NaN NaN
2 239393 NaN NaN
答案 2 :(得分:2)
选项1
最简单的我能想到的是列切片:
df['name'].join(df['contact_info']['mobile'])
first_name last_name mobile
1 AAA BBB 020202
2 111 222 239393
选项2
pd.DataFrame.filter
df.filter(regex='name|mobile')
name contact_info
first_name last_name mobile
1 AAA BBB 020202
2 111 222 239393
我们可以放弃水平
d = df.filter(regex='name|mobile')
d.columns = d.columns.droplevel(0)
d
first_name last_name mobile
1 AAA BBB 020202
2 111 222 239393
答案 3 :(得分:0)
您正在寻找的只需要basic indexing on a multiindex以及concat。这是一个例子:
df = pd.read_excel("multi-index-test.xlsx", header=[0, 1])
df1 = df[["name"]]
df2 = df['contact_info', 'mobile']
pd.concat([df1, df2], axis=1)
我相信这个解决方案的好处是:1)简单,2)一般。
答案 4 :(得分:0)
不确定为什么要避免使用concat,但这样做:
df = pd.read_excel("multi-index-test.xlsx", header=[0, 1], sheet_name="Mapping")
df.drop('address', level=0, axis=1).drop('e-mail', level=1, axis=1)
这利用了MultiIndex.drop()。