我有一个熊猫数据框,其列名称如下:
id ColNameOrig_x ColNameOrig_y
有许多这样的列,之所以出现'x'和'y'是因为合并了两个具有相似列名的数据集。 我需要做什么:
df.ColName = df.ColNameOrig_x + df.ColNameOrig_y
我现在手动对许多列(接近50)重复此行,是否有通配符方式?
答案 0 :(得分:1)
您可以使用下标语法动态访问列名称:
col_groups = ['ColName1', 'ColName2']
for grp in col_groups:
df[grp] = df[f'{grp}Orig_x'] + df[f'{grp}Orig_y']
或者您可以按列组进行汇总。例如
df = pd.DataFrame([
[1,2,3,4],
[5,6,7,8]
], columns=['ColName1Orig_x', 'ColName1Orig_y', 'ColName2Orig_x', 'ColName2Orig_y'])
# Here's your opportunity to define the wildcard
col_groups = df.columns.str.extract('(.+)Orig_[x|y]')[0]
df.columns = [col_groups, df.columns]
df.groupby(level=0, axis=1).sum()
输入:
ColName1Orig_x ColName1Orig_y ColName2Orig_x ColName2Orig_y
1 2 3 4
5 6 7 8
输出:
ColName1 ColName2
3 7
11 15
答案 1 :(得分:1)
您可以将DataFrame.filter
与DataFrame.groupby
配合使用lambda函数,并可以将axis=1
与汇总的sum
一起按列名称分组,也可以将Series.str.split
之类的文本函数与索引一起使用:
df1 = df.filter(like='_').groupby(lambda x: x.split('_')[0], axis=1).sum()
print (df1)
ColName1Orig ColName2Orig
0 3 7
1 11 15
df1 = df.filter(like='_').groupby(df.columns.str.split('_').str[0], axis=1).sum()
print (df1)
ColName1Orig ColName2Orig
0 3 7
1 11 15
df1 = df.filter(like='_').groupby(df.columns.str[:12], axis=1).sum()
print (df1)
ColName1Orig ColName2Orig
0 3 7
1 11 15