我想在python数据框中将每5列合并在一起,以便合并1-5,合并6-10,等等。
df看起来像
D1-7 D1-8 D1-9 D1-10 D1-11 D2-7 D2-8 D2-9 D2-10 D2-11
1 0 1 1 1 1 1 0 0 1
0 1 1 0 1 1 0 1 1 0
例如想要
D1-7-11 D2-7-12
10111 11001
01101 10110
答案 0 :(得分:3)
更新:
df = df.astype(str) #Just make sure dtype object in dataframe
df.groupby([i // 5 for i in map(df.columns.get_loc, df.columns)], axis=1)\
.apply(lambda x: pd.Series([''.join(i) for i in x.values]))
输出:
0 1
0 10111 11001
1 01101 10110
尝试:
df.astype(str).groupby([i // 5 for i in map(df.columns.get_loc, df.columns)], axis=1)\
.sum().astype(int)
输出:
0 1
0 10111 11001
1 1101 10110
说明:
使用pd.DataFrame.columns中的get_loc
方法以map
获取每列的索引位置。
然后,使用\\
(floordiv)乘5来将列分为5组。
使用groupby
和参数axis=1
,我们可以sum
连接每个组中的字符串值。然后,将结果转换为整数,使用astype
除去小数点零。
答案 1 :(得分:0)
没有上面那么整洁的地方,但是可以尝试一下:
for i in enumerate(np.array_split(df.columns.tolist(), np.ceil(len(df.columns)/5))):
df['combo'+str(i[0])] = df[i[1]].apply(lambda x: ','.join(x.dropna().astype('unicode')), axis=1)
将列拆分为5个块,遍历列表并将其与','联接在一起
答案 2 :(得分:0)
要执行任务,请按照以下步骤操作:
获取列名列表:
cc = df.columns
创建用于分组的映射。目标列将为C0
,C1
,...:
grp = { cc[i] : 'C' + str(i // 5) for i in range(len(cc)) }
定义联接函数(将一系列 int 转换为 一系列 str 并将它们连接起来:
def myJoin(x):
return ''.join(x.astype(str).values)
最后,执行您的加入:
df.groupby(grp, axis=1).agg(lambda x: myJoin(x))
出于演示目的,我将测试数据帧创建为:
D1-7 D1-8 D1-9 D1-10 D1-11 D2-7 D2-8 D2-9 D2-10 D2-11
0 1 2 3 4 5 6 7 8 9 0
1 0 1 2 3 4 5 6 7 8 9
结果是:
C0 C1
0 12345 67890
1 01234 56789