合并数据帧中的位列以形成整数列

时间:2017-11-03 08:22:15

标签: python pandas dataframe series

我有一个包含多个位列的数据帧,我想将它们组合成多个整数列。有人可以指导我怎么做吗?这是一个例子

Test A B C D E
t1   0 0 0 1 0
t2   1 0 1 0 1
t3   1 1 1 1 0 
t4   0 0 0 0 1

在这里,我想将3列组合在一起,所以我将{A,B,C}和{D,E}组合在一起,这是预期的输出:

Test X Y
t1   0 2
t2   5 1
t3   7 2
t4   0 1

有人可以指导我如何在python中执行此操作吗?

感谢。

2 个答案:

答案 0 :(得分:1)

首先转换为string s然后转换为apply lambda函数:

df = df.set_index('Test')
a = df[['A','B','C']].astype(str).apply(lambda x: int(''.join(x),2), 1)
b = df[['D','E']].astype(str).apply(lambda x: int(''.join(x),2), 1)

df = pd.DataFrame({'X':a, 'Y':b}).reset_index()
print (df)
  Test  X  Y
0   t1  0  2
1   t2  5  1
2   t3  7  2
3   t4  0  1

另一个更快的解决方案,由answers提供:

df = df.set_index('Test')

#define columns in dictionary
cols = {'X':['A','B','C'],'Y':['D','E']}

#dictionary of Series
d = {k:df[v].dot((1 << np.arange(len(v) - 1, -1, -1))) for k, v in cols.items()}

#alternative, inspired by divakar answer
#d ={k:pd.Series((2**np.arange(len(v)-1,-1,-1)).dot(df[v].values.T)) for k,v in cols.items()}

df = pd.concat(d, 1).reset_index()
print (df)
  Test  X  Y
0   t1  0  2
1   t2  5  1
2   t3  7  2
3   t4  0  1

动态解决方案 - 按dict of columns names创建arangedf = df.set_index('Test') cols = pd.Series(df.columns).groupby(np.arange(len(df.columns)) // 3).apply(list).to_dict() {0: ['A', 'B', 'C'], 1: ['D', 'E']} d = {k:df[v].dot((1 << np.arange(len(v) - 1, -1, -1))) for k, v in cols.items()} df = pd.concat(d, 1).reset_index() print (df) Test 0 1 0 t1 0 2 1 t2 5 1 2 t3 7 2 3 t4 0 1 创建的楼层划分辅助数组创建:

Eclipse Link

答案 1 :(得分:0)

您可以编写一个结合二进制列的列表的函数,如下所示:

def join_columns(df, columns, name):
    series = None
    for column in columns:
        if series is not None:
            series *= 2
            series += df[column]
        else:
            series = df[column].copy()
    series.name = name
    return series

然后使用它来组合数据框中的列:

X = join_columns(df, ['A', 'B', 'C'], 'X')
Y = join_columns(df, ['D', 'E'], 'Y')
print(pd.concat([X, Y], axis = 1))