【问题标题】:How to join column values in pandas MultiIndex DataFrame?如何在 pandas MultiIndex DataFrame 中加入列值?
【发布时间】:2017-10-09 14:46:23
【问题描述】:

如何在 MultiIndex pandas DataFrame 中连接同名列中的值?

data = [['1','1','2','3','4'],['2','5','6','7','8']]
df = pd.DataFrame(data, columns=['id','A','B','A','B'])
df = df.set_index('id')
df.columns = pd.MultiIndex.from_tuples([('result','A'),('result','B'),('student','A'),('student','B')])

df
   result    student   
        A  B       A  B
id                     
1       1  2       3  4
2       5  6       7  8

期望的结果:

        A       B
id                     
1       "1 3"   "2 4"
2       "5 7"   "6 8"

【问题讨论】:

  • 你可以试试swaplevel

标签: python pandas join dataframe


【解决方案1】:

新答案:

对于列中第二级MultiIndex 的连接值,请使用groupbyagg

#select columns define in list
df = df[['result','student']]
df1 = df.astype(str).groupby(level=1, axis=1).agg(' '.join)
print (df1)
      A    B
id          
1   1 3  2 4
2   5 7  6 8

旧答案:

您可以使用sort_index 对列进行排序,然后使用droplevel 删除MultiIndex 的第一级。

但是得到重复的列名。

print (df)
   result    student    col   
        A  B       A  B   A  B
id                            
1       1  2       3  4   6  7
2       5  6       7  8   2  1

#select columns define in list
df = df[['result','student']]
print (df)
   result    student   
        A  B       A  B
id                     
1       1  2       3  4
2       5  6       7  8

df = df.sort_index(axis=1, level=1)
df.columns = df.columns.droplevel(0)
print (df)
    A  A  B  B
id            
1   1  3  2  4
2   5  7  6  8

这样更好,唯一的列名可以由mapjoin 创建:

df = df.sort_index(axis=1, level=1)
df.columns = df.columns.map('_'.join)
print (df)
    result_A  student_A  result_B  student_B
id                                          
1          1          3         2          4
2          5          7         6          8

df = pd.concat([df['result'],df['student']], axis=1).sort_index(axis=1)
print (df)
    A  A  B  B
id            
1   1  3  2  4
2   5  7  6  8

【讨论】:

  • 我想加入基于列名的值
  • 请检查上次编辑。获取重复的列名不是问题吗?
【解决方案2】:

我不完全确定你在问什么。如果您有两个单独的数据框,那么您应该可以只使用pd.concat

pd.concat([df1, df2], axis=1)

如果您有一个数据框,则只需删除索引的顶层即可。

df.columns = df.columns.droplevel(0)

【讨论】:

  • pd.concat([df['result'],df['student']], axis=1)df.columns = df.columns.droplevel(0) 结果 ` A B A B` ` id ` ` 1 1 2 3 4` ` 2 5 6 7 8`
猜你喜欢
  • 2020-06-15
  • 2016-11-06
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 2019-02-08
  • 2019-02-16
  • 2023-04-08
相关资源
最近更新 更多