我有一个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、unstack
和groupby
作为索引,并应用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