python – 如何处理列名称和创建新列

这是我的pandas DataFrame,带有原始列名.

old_dt_cm1_tt   old_dm_cm1   old_rr_cm2_epf   old_gt
1               3            0                0
2               1            1                5

>首先,我想提取cm的所有独特变体,例如在这种情况下cm1和cm2.
>在此之后,我想为每个独特的cm创建一个新列.在此示例中,应该有2个新列.
>最后,在每个新列中,我应该存储非零原始列值的总数,即

06001

我实现了第一步如下:

cols = pd.DataFrame(list(df.columns))
ind = [c for c in df.columns if 'cm' in c]
df.ix[:, ind].columns

如何继续执行步骤2和3,以便解决方案是自动的(我不想手动定义列名cm1和cm2,因为在原始数据集中我可能有很多cm变化.

最佳答案 您可以使用:

print df
   old_dt_cm1_tt  old_dm_cm1  old_rr_cm2_epf  old_gt
0              1           3               0       0
1              2           1               1       5

首先,您可以将filter列包含字符串cm,因此将删除不包含cm的列.

df1 = df.filter(regex='cm')

现在,您可以将列更改为新值,如cm1,cm2,cm3.

print [cm for c in df1.columns for cm in c.split('_') if cm[:2] == 'cm']
['cm1', 'cm1', 'cm2']

df1.columns = [cm for c in df1.columns for cm in c.split('_') if cm[:2] == 'cm']
print df1
   cm1  cm1  cm2
0    1    3    0
1    2    1    1

现在您可以计算非零值 – 将df1更改为布尔值DataFrame,将sum – True转换为1并将False转换为0.您需要按唯一列名称计数 – 因此groupby列和sum值.

df1 = df1.astype(bool)
print df1
    cm1   cm1    cm2
0  True  True  False
1  True  True   True

print df1.groupby(df1.columns, axis=1).sum()
   cm1  cm2
0    2    0
1    2    1

您需要unique列,这些列将添加到原始df:

print df1.columns.unique()
['cm1' 'cm2']

最后你可以从groupby函数添加df [[‘cm1′,’cm2’]]的新列:

df[df1.columns.unique()] = df1.groupby(df1.columns, axis=1).sum()
print df
   old_dt_cm1_tt  old_dm_cm1  old_rr_cm2_epf  old_gt  cm1  cm2
0              1           3               0       0    2    0
1              2           1               1       5    2    1
点赞