我有一个包含多个位列的数据帧,我想将它们组合成多个整数列。有人可以指导我怎么做吗?这是一个例子
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中执行此操作吗?
感谢。
答案 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
创建arange
按df = 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))