pandas:如果列的名称部分相似,则将它们合并



我有一个DataFrame,如下所示,

import pandas as pd
df = pd.DataFrame({'sent_a.1': [0, 3, 2, 1],
'sent_a.2': [0, 1, 4, 0],
'sent_b.3': [0, 6, 0, 8],
'sent_b.4': [1, 1, 8, 6]
})

我想合并共享名称的列。所以想要的输出是

sent_a  sent_b  
0     0,0    0,1
1     3,1    6,1
2     2,4    0,8 
3     1,0    8,6

我已经完成了以下操作,代码也能工作,但由于我最初的DataFrame有200多列,我正在寻找一种更快的方法。

df['sent_a'] = df['sent_a.1']+','+ df['sent_a.2']
df['sent_b'] = df['sent_b.1']+','+ df['sent_b.2']
df = df.drop(['sent_a.1', 'sent_a.2', 'sent_b.3', 'sent_b.4'], axis=1)

您可以在列上使用列名的左侧部分作为组groupby

# get left part of name
group = df.columns.str.split('.').str[0]
# groupby and join as string
(df.astype(str).groupby(group, axis=1)
.apply(lambda d: d.apply(','.join, axis=1))
)

输出:

sent_a sent_b
0    0,0    0,1
1    3,1    6,1
2    2,4    0,8
3    1,0    8,6

您可以将列MultiIndex、unstackgroupby作为索引,并应用join以获得与所需结果类似的序列。swaplevel+unstack将获取所需的DataFrame。

df.columns = pd.MultiIndex.from_tuples(col.split('.') for col in df.columns)
out = df.unstack().astype(str).droplevel(1).groupby(level=[0,1]).agg(','.join).swaplevel().unstack()

输出:

sent_a sent_b
0    0,0    0,1
1    3,1    6,1
2    2,4    0,8
3    1,0    8,6

您可以按列名的第一部分进行分组,使用axis=1(按列而不是按行分组(,对于每个组,使用内置的functools.reduce将所有列连接在一起:

import functools as ft
new_df = df.groupby(df.columns.str.split('.').str[0], axis=1).apply(lambda g: ft.reduce(lambda x, y: x + ',' + y, [x[col].astype(str) for col in x]))

输出:

>>> new_df
sent_a sent_b
0    0,0    0,0
1    3,1    3,1
2    2,4    2,4
3    1,0    1,0

最新更新