Python:基于列与列表连接列

我有一个DataFrame如下:


df

      A    B     C    D    E    key

0  test    Z  10.0    a    a  10111

1  test    A  10.0    a    a  10111

2  test    x   2.0    a    b  11010

3  test    5  12.0    b    b  10100

4  test    x   5.0    c    b  11000

5  test    2  14.0    g    c  10111

我需要得到的是将所有字符串相应地连接到key列:


keyat position[0]是 for col A,keyat position[1]是 forcol B等等...

每个1in 用于拍摄,每个0用于跳过列

结果应如下所示:


      A    B     C    D    E    key     key_val

0  test    Z  10.0    a    a  10111  test10.0aa

1  test    A  10.0    a    a  10111  test10.0aa

2  test    x   2.0    a    b  11010      testxa

3  test    5  12.0    b    b  10100    test12.0

4  test    x   5.0    c    b  11000       testx

5  test    2  14.0    g    c  10111  test14.0gc

到目前为止我所做的 - 我创建了 key_list 列:


df['key_list'] = df['key'].apply(lambda x: list(str(x)))


df

      A  B     C  D  E    key         key_list

0  test  Z  10.0  a  a  10111  [1, 0, 1, 1, 1]

1  test  A  10.0  a  a  10111  [1, 0, 1, 1, 1]

2  test  x   2.0  a  b  11010  [1, 1, 0, 1, 0]

3  test  5  12.0  b  b  10100  [1, 0, 1, 0, 0]

4  test  x   5.0  c  b  11000  [1, 1, 0, 0, 0]

5  test  2  14.0  g  c  10111  [1, 0, 1, 1, 1]

下一步我已经尝试过了(我想乘以 1 或 0 来包含或排除字符串):


df.apply((df['A'].astype(str) * df['key_list'][0]) +

         (df['B'].astype(str) * df['key_list'][1]) +

         (df['C'].astype(str) * df['key_list'][2]) +

         (df['D'].astype(str) * df['key_list'][3]) +

         (df['E'].astype(str) * df['key_list'][4]), axis=1)

但这似乎是错误的想法:ValueError: operands could not be broadcast together with shapes (6,) (5,)。我遵循字符串连接的常见做法,只是额外的步骤:


df['A'].astype(str) + df['B'].astype(str) + df['C'].astype(str) + df['D'].astype(str) + df['E'].astype(str)


梦里花落0921
浏览 91回答 1
1回答

鸿蒙传说

想法是将key列转换为掩码,然后用空字符串替换不匹配DataFrame.where并求和join:c = ['A','B','C','D','E']L = [list(str(x)) for x in df['key']]m = pd.DataFrame(L, columns=c, index=df.index).fillna(0).astype(int).astype(bool)print (m)      A      B      C      D      E0  True  False   True   True   True1  True  False   True   True   True2  True   True  False   True  False3  True  False   True  False  False4  True   True  False  False  False5  True  False   True   True   Truedf['key_val'] = df[c].where(m, '').astype(str).sum(axis=1)print (df)      A  B     C  D  E    key     key_val0  test  Z  10.0  a  a  10111  test10.0aa1  test  A  10.0  a  a  10111  test10.0aa2  test  x   2.0  a  b  11010      testxa3  test  5  12.0  b  b  10100    test12.04  test  x   5.0  c  b  11000       testx5  test  2  14.0  g  c  10111  test14.0gc
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python