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

时间:2016-03-11 14:27:28

标签: python pandas dataframe

这是我的pandas DataFrame,原始列名称。

old_dt_cm1_tt   old_dm_cm1   old_rr_cm2_epf   old_gt
1               3            0                0
2               1            1                5
  1. 首先,我想提取cm的所有独特变体,例如在这种情况下cm1cm2
  2. 在此之后,我想为每个唯一cm创建一个新列。在此示例中,应该有2个新列。
  3. 最后,在每个新列中,我应该存储非零原始列值的总数,即
  4. old_dt_cm1_tt   old_dm_cm1   old_rr_cm2_epf   old_gt    cm1    cm2    
    1               3            0                0         2      0        
    2               1            1                5         2      1
    

    我实施了第一步如下:

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用:

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')

现在,您可以将列更改为新值,例如cm1cm2cm3

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转换为1False0。您需要按唯一列名称进行计数 - 因此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']

最后,您可以通过df[['cm1','cm2']]函数{/ p> groupby添加新列

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

答案 1 :(得分:0)

一旦您知道哪些列中包含EqualityComparable,您就可以将它们(使用if (!(x==y)))映射到所需的新列,其中包含this answer的改编版本:

cm

这样代替dict之后的字符串,它就是厘米而后面跟着的字符,在这种情况下它将是:

col_map = {c:'cm'+c[c.index('cm') + len('cm')] for c in ind}
                                   #   ^ if you are hard coding this in you might as well use 2

然后通过迭代cm

将新列添加到DataFrame
{'old_dm_cm1': 'cm1', 'old_dt_cm1_tt': 'cm1', 'old_rr_cm2_epf': 'cm2'}

请注意,如果值为0,则dict将仅提供for col,new_col in col_map.items(): if new_col not in df: df[new_col] =[int(a!=0) for a in df[col]] else: df[new_col]+=[int(a!=0) for a in df[col]] ,否则为int(a!=0)。唯一的问题是因为0本身是无序的,因此根据值按顺序添加新列可能更为可取:(如the answer here

1

确保按顺序插入新列。