为了账号安全,请及时绑定邮箱和手机立即绑定

Python:基于列与列表连接列

Python:基于列与列表连接列

梦里花落0921 2022-07-26 10:54:31
我有一个DataFrame如下:df      A    B     C    D    E    key0  test    Z  10.0    a    a  101111  test    A  10.0    a    a  101112  test    x   2.0    a    b  110103  test    5  12.0    b    b  101004  test    x   5.0    c    b  110005  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_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到目前为止我所做的 - 我创建了 key_list 列:df['key_list'] = df['key'].apply(lambda x: list(str(x)))df      A  B     C  D  E    key         key_list0  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)
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

想法是将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      E

0  True  False   True   True   True

1  True  False   True   True   True

2  True   True  False   True  False

3  True  False   True  False  False

4  True   True  False  False  False

5  True  False   True   True   True


df['key_val'] = df[c].where(m, '').astype(str).sum(axis=1)

print (df)

      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


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信