这是我的 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 个新列。 - 最后,在每个新列中,我应该存储非零原始列值的总数,即
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,以便解决方案是自动的(我不想手动定义列名 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
更改为 bool 值 DataFrame
和 sum
- True
是转换为 1
和 False
为 0
。您需要按唯一的列名进行计数 - 所以 groupby
列和 sum
值(value)观。
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']]
从 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
关于python - 如何处理列名和创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35942709/