这是我的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
种变种。
答案 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')
现在,您可以将列更改为新值,例如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']
最后,您可以通过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
:
{'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
确保按顺序插入新列。