【问题标题】:How can I summarize several pandas dataframe columns into a parent column name?如何将几个 pandas 数据框列汇总为父列名?
【发布时间】:2023-03-25 16:37:01
【问题描述】:

我有一个看起来像这样的数据框

        some feature  another feature  label
sample
0       ...           ...              ...

我想得到一个带有 multiindexed 这样的列的数据框

        features            label
sample  some       another
0       ...        ...      ...

从 API 来看,我不清楚如何正确使用 from_arrays()from_product()from_tuples()from_frame()。该解决方案不应依赖于特征列的字符串解析(some featureanother feature)。标签的最后一列是最后一列,可以使用它的列名label。我怎样才能得到我想要的?

【问题讨论】:

  • df.columns = df.columns.str.split('_',expand=True) ?

标签: python pandas dataframe multi-index


【解决方案1】:

从 API 来看,我不清楚如何正确使用 from_arrays()from_product()from_tuples()from_frame()

主要用于生成具有MultiIndex的新DataFrame,独立于原始列名。

所以这意味着如果需要全新的MultiIndex,例如通过列表或数组:

a = ['a','a','b']
b = ['x','y','z']
df.columns = pd.MultiIndex.from_arrays([a,b])
print (df)
        a     b
        x  y  z
sample         
0       2  3  5
1       4  5  7

EDIT1:如果想要将所有列设置为MultiIndex 所有列都以相同的方式没有最后一个:

a = ['parent'] * (len(df.columns) - 1) + ['label']
b = df.columns[:-1].tolist() + ['val']
df.columns = pd.MultiIndex.from_arrays([a,b])
print (df)
          parent           label
       feature a feature b   val
sample                          
0              2         3     5
1              4         5     7

split 是可能的,但是如果某些没有分隔符的列在第二级得到 NaNs,因为不可能组合 MultiIndex 而不是 MultiIndex 列(实际上是的,但是从 MultiIndex 列中获取元组) :

print (df)
        feature_a  feature_b  label
sample                             
0               2          3      5
1               4          5      7

df.columns = df.columns.str.split(expand=True)
print (df)
       feature    label
             a  b   NaN
sample                 
0            2  3     5
1            4  5     7

所以最好先将所有不带分隔符的列转换为Index/MultiIndex DataFrame.set_index

df = df.set_index('label')
df.columns = df.columns.str.split(expand=True)
print (df)
      feature   
            a  b
label           
5           2  3
7           4  5

为了防止原始索引被使用append=True参数:

df = df.set_index('label', append=True)
df.columns = df.columns.str.split(expand=True)
print (df)
             feature   
                   a  b
sample label           
0      5           2  3
1      7           4  5

【讨论】:

  • 这个问题具有误导性。我需要一个不依赖字符串解析的解决方案。
  • @thinwybk - 嗯,所以现在 df.columns = df.columns.str.split(expand=True) 不能用空格分割?
  • @thinwybk - 因为 MultiIndex 意味着一些对、三元组......从列名生成,对吧?如果不拆分,这里的逻辑是什么?
  • 使用分层列索引拆分和重建一个新的数据框也可以。
  • 非常感谢。这正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 2020-08-22
  • 2021-07-13
  • 2021-11-07
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2016-11-12
  • 2021-03-12
相关资源
最近更新 更多