如何在python中合并多个列

时间:2019-02-26 21:06:20

标签: python pandas

我想在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

3 个答案:

答案 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

创建用于分组的映射。目标列将为C0C1,...:

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