如何在DataFrame的一列中添加DataFrame

时间:2019-02-12 13:45:37

标签: python pandas

我正在创建一个数据框来存储样本信息。我的某些列标签的格式为index:subindex。有更好的方法吗?我当时在看pd.MultiIndex,但是我的子索引特定于该索引。

import pandas as pd
df = pd.DataFrame(
    np.random.random(size=(1234, 6)),
    columns=['ID',
             'Charge:pH2', 'Charge:pH4', 'Charge:pH6',
             'Extinction:Wavelength200nm', 'Extinction:Wavelength500nm'])

我希望能够致电df.loc[:, 'ID']df.loc[:, 'Charge']df.loc[:, ('Charge', 'pH6')]

2 个答案:

答案 0 :(得分:2)

您可以使用MultiIndex.from_tuple

import numpy as np
import pandas as pd

df = pd.DataFrame(
    np.random.random(size=(1234, 6)),
    columns=['ID','Charge:pH2', 'Charge:pH4', 'Charge:pH6','Extinction:Wavelength200nm', 'Extinction:Wavelength500nm'])

df.columns = pd.MultiIndex.from_tuples(map(tuple, df.columns.str.split(':')))

print(df.head(10))

输出

         ID    Charge       ...            Extinction                
        NaN       pH2       ...       Wavelength200nm Wavelength500nm
0  0.301592  0.137384       ...              0.074137        0.339948
1  0.737711  0.557524       ...              0.813727        0.586845
2  0.615398  0.529687       ...              0.148700        0.466916
3  0.411509  0.725513       ...              0.380019        0.876992
4  0.031172  0.623944       ...              0.311610        0.488207
5  0.022140  0.450630       ...              0.422927        0.479094
6  0.119681  0.221624       ...              0.710848        0.719201
7  0.252039  0.632321       ...              0.453235        0.952687
8  0.379501  0.356493       ...              0.141977        0.028836
9  0.249950  0.316020       ...              0.307337        0.881437

[10 rows x 6 columns]

所有必需的索引方案均有效:

print(df.loc[:, 'ID'].shape)
print(df.loc[:, 'Charge'].shape)
print(df.loc[:, ('Charge', 'pH6')].shape)

输出

(1234, 1)
(1234, 3)
(1234,)

答案 1 :(得分:1)

我认为最好的方法是创建没有列可能分裂的索引或多索引(不使用拆分器),然后用MultiIndex通过split创建expand=True

np.random.seed(2019)
df = pd.DataFrame(
    np.random.random(size=(3, 6)),
    columns=['ID',
             'Charge:pH2', 'Charge:pH4', 'Charge:pH6',
             'Extinction:Wavelength200nm', 'Extinction:Wavelength500nm'])

df = df.set_index('ID')
df.columns = df.columns.str.split(':', expand=True)
print (df)
            Charge                          Extinction                
               pH2       pH4       pH6 Wavelength200nm Wavelength500nm
ID                                                                    
0.903482  0.393081  0.623970  0.637877        0.880499        0.299172
0.702198  0.903206  0.881382  0.405750        0.452447        0.267070
0.162865  0.889215  0.148476  0.984723        0.032361        0.515351

可能未在索引中设置ID的解决方案,但对于未拆分的列名称,将NaN用作第二级:

df.columns = df.columns.str.split(':', expand=True)
print (df)
         ID    Charge                          Extinction                
        NaN       pH2       pH4       pH6 Wavelength200nm Wavelength500nm
0  0.903482  0.393081  0.623970  0.637877        0.880499        0.299172
1  0.702198  0.903206  0.881382  0.405750        0.452447        0.267070
2  0.162865  0.889215  0.148476  0.984723        0.032361        0.515351

最后一次按列名称选择,如果要第二级选择,也可以使用DataFrame.xs

print (df['Charge'])
               pH2       pH4       pH6
ID                                    
0.903482  0.393081  0.623970  0.637877
0.702198  0.903206  0.881382  0.405750
0.162865  0.889215  0.148476  0.984723

print (df.xs('Charge', axis=1, level=0))
               pH2       pH4       pH6
ID                                    
0.903482  0.393081  0.623970  0.637877
0.702198  0.903206  0.881382  0.405750
0.162865  0.889215  0.148476  0.984723

print (df.xs('pH4', axis=1, level=1))
            Charge
ID                
0.903482  0.623970
0.702198  0.881382
0.162865  0.148476